本文档简要介绍了 BigQuery 订阅, 其工作流程和关联的属性
BigQuery 订阅是一种导出订阅 可将消息写入现有 BigQuery 表,如 。您无需配置单独的订阅者客户端。 使用 Google Cloud 控制台、Google Cloud CLI、客户端库或 Pub/Sub API 创建、更新、列出、分离或删除 BigQuery 订阅。
如果没有 BigQuery 订阅类型 您需要一个拉取或推送订阅和一个订阅者 (例如 Dataflow),它可以读取消息并将其写入 BigQuery 表。在 Google Cloud 中 如果消息不需要,则 Dataflow 作业不是必需的 在将其存储到 BigQuery 表中之前进行额外处理; 可以改用 BigQuery 订阅
不过,我们仍建议使用 Dataflow 流水线 之前需要进行一些数据转换的 Pub/Sub 系统 数据存储在 BigQuery 表中。了解如何直播 通过转换将数据从 Pub/Sub 传输到 BigQuery 请参阅“从 Pub/Sub 流式传输到 BigQuery。
来自 Dataflow 的 Pub/Sub 订阅 BigQuery 模板强制执行仅传送一次, 默认值。这通常通过 Dataflow 流水线不过,BigQuery 订阅仅支持至少一次传送。如果精确重复信息删除 对于您的应用场景至关重要,请考虑使用 Google Cloud 中的 BigQuery 处理可能重复的数据。
准备工作
在阅读本文档之前,请确保您熟悉以下内容:
Pub/Sub 的工作原理及不同之处 Pub/Sub 条款。
不同的订阅类型 以及为什么你可能想要使用 BigQuery 订阅。
BigQuery 的工作原理以及如何配置 以及管理 BigQuery 表。
BigQuery 订阅工作流
下图显示了 BigQuery 和 订阅和 BigQuery。
![BigQuery 订阅的消息流](https://cloud.google.com/static/pubsub/images/subscriber_bigquery.png?authuser=5&hl=zh-cn)
以下是引用图 1 的工作流的简要说明:
- Pub/Sub 使用 BigQuery 存储写入 API将数据发送到 BigQuery 表格。
- 这些消息将批量发送到 BigQuery 表。
- 成功完成写入操作后,API 会返回 OK 响应。
- 如果写入操作发生任何失败, Pub/Sub 消息本身已得到否定确认。通过 该邮件会重新发送。如果消息失败的次数足够多, 订阅配置的死信主题,那么消息会被移动 到死信主题
BigQuery 订阅的属性
您为 BigQuery 订阅配置的属性 确定将 Pub/Sub 添加到哪个 BigQuery 表 该表会写入消息以及该表的架构类型
有关详情,请参阅 BigQuery 属性。
架构兼容性
Pub/Sub 和 BigQuery 使用不同的方式 定义其架构Pub/Sub 架构在 Apache 中 Avro 或 Protocol Buffer 格式,同时 BigQuery 架构是使用 丰富多样的广告格式。下面列出了 关于集群间架构兼容性的重要信息 Pub/Sub 主题和 BigQuery 表。
任何包含格式不正确字段的邮件都不会写入到 BigQuery。
在 BigQuery 架构中,
INT
、SMALLINT
、INTEGER
BIGINT
、TINYINT
和BYTEINT
是INTEGER
的别名;DECIMAL
是NUMERIC
的别名;而BIGDECIMAL
是BIGNUMERIC
的别名。如果主题架构中的类型是
string
,并且 BigQuery 表为JSON
、TIMESTAMP
、DATETIME
、DATE
TIME
、NUMERIC
或BIGNUMERIC
,然后指定此字段在 Pub/Sub 消息必须遵循为 BigQuery 数据 类型。支持某些 Avro 逻辑类型,如下表所示。 未列出的任何逻辑类型仅与其等效的 Avro 类型匹配 注释,详情请参阅 Avro 规范。
以下是不同架构格式与 BigQuery 数据类型。
Avro 类型
Avro 类型 | BigQuery 数据类型 |
null |
Any NULLABLE |
boolean |
BOOLEAN |
int |
INTEGER 、NUMERIC 或
BIGNUMERIC |
long |
INTEGER 、NUMERIC 或
BIGNUMERIC |
float |
FLOAT64 、NUMERIC 或
BIGNUMERIC |
double |
FLOAT64 、NUMERIC 或
BIGNUMERIC |
bytes |
BYTES 、NUMERIC 或
BIGNUMERIC |
string |
STRING 、JSON 、
TIMESTAMP 、DATETIME 、
DATE 、TIME 、
NUMERIC 或 BIGNUMERIC |
record |
RECORD/STRUCT |
array /Type |
REPEATED Type |
值为“ValueType ”的“map ”
|
REPEATED STRUCT <key STRING, value
ValueType> |
union 有两种类型,一种是
null 和其他Type |
NULLABLE Type |
其他union |
无法映射 |
fixed |
BYTES 、NUMERIC 或
BIGNUMERIC |
enum |
INTEGER |
Avro 逻辑类型
Avro 逻辑类型 | BigQuery 数据类型 |
timestamp-micros |
TIMESTAMP |
date |
DATE |
time-micros |
TIME |
duration |
INTERVAL |
decimal |
NUMERIC 或 BIGNUMERIC |
协议缓冲区类型
协议缓冲区类型 | BigQuery 数据类型 |
double |
FLOAT64 、NUMERIC 或
BIGNUMERIC |
float |
FLOAT64 、NUMERIC 或
BIGNUMERIC |
int32 |
INTEGER 、NUMERIC 、
BIGNUMERIC 或 DATE |
int64 |
INTEGER 、NUMERIC 、
BIGNUMERIC 、DATE 、
DATETIME 或 TIMESTAMP |
uint32 |
INTEGER 、NUMERIC 、
BIGNUMERIC 或 DATE |
uint64 |
NUMERIC 或 BIGNUMERIC |
sint32 |
INTEGER 、NUMERIC 或
BIGNUMERIC |
sint64 |
INTEGER 、NUMERIC 、
BIGNUMERIC 、DATE 、
DATETIME 或 TIMESTAMP |
fixed32 |
INTEGER 、NUMERIC 、
BIGNUMERIC 或 DATE |
fixed64 |
NUMERIC 或 BIGNUMERIC |
sfixed32 |
INTEGER 、NUMERIC 、
BIGNUMERIC 或 DATE |
sfixed64 |
INTEGER 、NUMERIC 、
BIGNUMERIC 、DATE 、
DATETIME 或 TIMESTAMP |
bool |
BOOLEAN |
string |
STRING 、JSON 、
TIMESTAMP 、DATETIME 、
DATE 、TIME 、
NUMERIC 或 BIGNUMERIC |
bytes |
BYTES 、NUMERIC 或
BIGNUMERIC |
enum |
INTEGER |
message |
RECORD/STRUCT |
oneof |
无法映射 |
map<KeyType, ValueType> |
REPEATED RECORD<key KeyType, value
ValueType> |
enum |
INTEGER |
repeated/array of Type |
REPEATED Type |
日期和时间整数表示
当从整数映射到日期或时间类型之一时,数字必须 代表正确的值。下面是根据 BigQuery 数据生成的 改为表示它们的整数。
BigQuery 数据类型 | 整数表示法 |
DATE |
自 Unix 纪元(1970 年 1 月 1 日)以来的天数 |
DATETIME |
使用 CivilTimeEncoder |
TIME |
使用 CivilTimeEncoder |
TIMESTAMP |
从 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)开始计算的微秒数 |
BigQuery 变更数据捕获
BigQuery 订阅支持变更数据捕获 (CDC)
更新
use_topic_schema
或
use_table_schema
在订阅属性中设置为 true
。要通过
use_topic_schema
,请使用
以下字段:
_CHANGE_TYPE
(必需):string
字段,设置为UPSERT
或DELETE
。如果一条 Pub/Sub 消息写入到 BigQuery 表的
_CHANGE_TYPE
设置为UPSERT
, 如果存在以下情况,BigQuery 将使用相同的键更新该行: 或插入新行(如果不存在)。如果一条 Pub/Sub 消息写入到 BigQuery 表的
_CHANGE_TYPE
设置为DELETE
, 则 BigQuery 会删除表中具有 相同的键(如果存在)。
如需将该功能与 use_table_schema
搭配使用,请将前面的字段包含在
JSON 消息。
Pub/Sub 服务账号权限
为了创建 BigQuery 订阅,Pub/Sub 服务账号必须拥有 BigQuery 表并读取表元数据。有关 请参阅将 BigQuery 角色分配给 Pub/Sub 服务 账号。
处理消息失败问题
Pub/Sub 消息无法写入
BigQuery,无法确认消息。要将此类邮件
无法送达的邮件,请配置死信
主题上
BigQuery 订阅。Pub/Sub 消息
转发到死信主题的内容包含属性
CloudPubSubDeadLetterSourceDeliveryErrorMessage
,其原因为
无法将 Pub/Sub 消息写入到
BigQuery。
如果 Pub/Sub 无法将消息写入 BigQuery, 则 Pub/Sub 会以类似于 推送退避行为。但是,如果 订阅具有 已附加死信主题 因此当消息失败时,Pub/Sub 不会暂停传送 都是由架构兼容性错误造成的
配额和限制
BigQuery 订阅方存在配额限制 每个区域的吞吐量如需了解详情,请参阅 Pub/Sub 配额 和限制。
BigQuery 订阅使用 写入数据, BigQuery Storage Write API。对于 有关配额和限制的信息,请参阅 BigQuery Storage Write API 请求。BigQuery 订阅仅使用 Storage Write API 的吞吐量配额。您 可以忽略此实例中的其他 Storage Write API 配额注意事项。
价格
如需了解 BigQuery 订阅的价格,请参阅 Pub/Sub 价格页面。
后续步骤
创建订阅,例如 BigQuery 订阅。
排查 BigQuery 问题 订阅。
了解 BigQuery。
查看 Pub/Sub 的价格,包括 BigQuery 订阅。
使用 REST 创建或修改订阅 API。