本文档简要介绍了 BigQuery 订阅、其工作流和相关属性。
BigQuery 订阅是一种导出订阅 可将消息写入现有 BigQuery 表,如 。您无需配置单独的订阅者客户端。 您可以使用 Google Cloud 控制台、Google Cloud CLI、客户端库或 Pub/Sub API 创建、更新、列出、分离或删除 BigQuery 订阅。
如果没有 BigQuery 订阅类型 您需要一个拉取或推送订阅和一个订阅者 (例如 Dataflow),它可以读取消息并将其写入 BigQuery 表。如果消息在存储到 BigQuery 表之前不需要额外处理,则无需运行 Dataflow 作业的开销;您可以改用 BigQuery 订阅。
不过,我们仍建议使用 Dataflow 流水线 之前需要进行一些数据转换的 Pub/Sub 系统 数据存储在 BigQuery 表中。如需了解如何使用 Dataflow 将经过转换的数据从 Pub/Sub 流式传输到 BigQuery,请参阅从 Pub/Sub 流式传输到 BigQuery。
来自 Dataflow 的 Pub/Sub 订阅 BigQuery 模板强制执行仅传送一次, 默认值。这通常通过 Dataflow 流水线不过,BigQuery 订阅仅支持至少传送一次。如果精确重复信息删除 对于您的应用场景至关重要,请考虑使用 Google Cloud 中的 BigQuery 处理可能重复的数据。
准备工作
在阅读本文档之前,请确保您熟悉以下内容:
Pub/Sub 的工作原理以及不同的 Pub/Sub 术语。
Pub/Sub 支持的不同订阅类型,以及您可能需要使用 BigQuery 订阅的原因。
BigQuery 的工作原理以及如何配置 以及管理 BigQuery 表。
BigQuery 订阅工作流
下图显示了 BigQuery 订阅和 BigQuery 之间的工作流。
下面简要介绍了引用图 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 变更数据捕获
当订阅属性中的 use_topic_schema
或 use_table_schema
设置为 true
时,BigQuery 订阅支持变更数据捕获 (CDC) 更新。要通过
use_topic_schema
,请使用
以下字段:
_CHANGE_TYPE
(必需):string
字段,设置为UPSERT
或DELETE
。如果写入 BigQuery 表的 Pub/Sub 消息将
_CHANGE_TYPE
设置为UPSERT
,则 BigQuery 会更新具有相同键的行(如果存在)或插入新行(如果不存在)。如果一条 Pub/Sub 消息写入到 BigQuery 表的
_CHANGE_TYPE
设置为DELETE
, 则 BigQuery 会删除表中 相同的键(如果存在)。
_CHANGE_SEQUENCE_NUMBER
(可选):设置的int64
(long
) 或int32
(int
) 字段,用于确保按顺序处理对 BigQuery 表进行的更新和删除操作。私信数量 必须包含单调递增的值 价格为_CHANGE_SEQUENCE_NUMBER
。序列号属于 小于为某一行处理的最高序列号 对 BigQuery 表中的行没有任何影响。注意事项 Pub/Sub 需要整数值,而不是 与 BigQuery 交互时使用的基于字符串的值 。
如需将该功能与 use_table_schema
搭配使用,请将上述字段包含在
JSON 消息。
Pub/Sub 服务账号权限
如需创建 BigQuery 订阅,Pub/Sub 服务账号必须有权写入特定 BigQuery 表并读取表元数据。如需了解详情,请参阅向 Pub/Sub 服务账号分配 BigQuery 角色。
处理消息失败问题
Pub/Sub 消息无法写入
BigQuery,无法确认消息。如需转发此类无法传送的消息,请在 BigQuery 订阅上配置死信主题。转发到死信主题的 Pub/Sub 消息包含属性 CloudPubSubDeadLetterSourceDeliveryErrorMessage
,其中包含 Pub/Sub 消息无法写入 BigQuery 的原因。
如果 Pub/Sub 无法将消息写入 BigQuery,则会以类似于推送延迟行为的方式延迟消息传送。不过,如果订阅附加了死信主题,当消息传送失败是由于架构兼容性错误时,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 订阅。
使用
gcloud
CLI 命令创建或修改订阅。使用 REST API 创建或修改订阅。