BigQuery 订阅

本文档简要介绍了 BigQuery 订阅, 其工作流程和关联的属性

BigQuery 订阅是一种导出订阅 可将消息写入现有 BigQuery 表,如 。您无需配置单独的订阅方客户端。您可以使用 Google Cloud 控制台、Google Cloud CLI、客户端库或 Pub/Sub API 创建、更新、列出、分离或删除 BigQuery 订阅。

如果没有 BigQuery 订阅类型 您需要一个拉取或推送订阅和一个订阅者 (例如 Dataflow),它可以读取消息并将其写入 BigQuery 表。如果消息在存储到 BigQuery 表之前不需要额外处理,则无需运行 Dataflow 作业的开销;您可以改用 BigQuery 订阅。

不过,对于需要在将数据存储在 BigQuery 表中之前进行一些数据转换的 Pub/Sub 系统,我们仍然建议使用 Dataflow 流水线。如需了解如何使用 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 之间的工作流。

BigQuery 订阅的消息流
图 1:BigQuery 订阅的工作流

下面简要介绍了引用图 1 的工作流程:

  1. Pub/Sub 使用 BigQuery 存储写入 API将数据发送到 BigQuery 表格。
  2. 这些消息将批量发送到 BigQuery 表。
  3. 写入操作成功完成后,API 会返回“OK”响应。
  4. 如果写入操作发生任何失败, Pub/Sub 消息本身已得到否定确认。通过 该邮件会重新发送。如果消息失败的次数足够多, 订阅配置的死信主题,那么消息会被移动 到死信主题

BigQuery 订阅的属性

您为 BigQuery 订阅配置的属性决定了 Pub/Sub 将消息写入的 BigQuery 表以及该表的架构类型。

有关详情,请参阅 BigQuery 属性

架构兼容性

此部分仅在您选择 选项使用主题架构 您需要填写的信息

Pub/Sub 和 BigQuery 使用不同的方式来定义其架构。Pub/Sub 架构采用 Apache Avro 或 Protocol Buffer 格式定义,而 BigQuery 架构采用多种格式定义。

下面列出了 关于集群间架构兼容性的重要信息 Pub/Sub 主题和 BigQuery 表。

  • 任何包含格式不正确的字段的消息都不会写入 BigQuery。

  • 在 BigQuery 架构中,INTSMALLINTINTEGER BIGINTTINYINTBYTEINTINTEGER 的别名;DECIMALNUMERIC 的别名;而 BIGDECIMALBIGNUMERIC 的别名。

  • 如果主题架构中的类型是 string,并且 BigQuery 表为 JSONTIMESTAMPDATETIMEDATE TIMENUMERICBIGNUMERIC,然后指定此字段在 Pub/Sub 消息必须遵循为 BigQuery 数据 类型

  • 支持某些 Avro 逻辑类型,如下表所示。 未列出的任何逻辑类型仅与其等效的 Avro 类型匹配 注释,详情请参阅 Avro 规范

以下是不同架构格式与 BigQuery 数据类型。

Avro 类型

Avro 类型 BigQuery 数据类型
null Any NULLABLE
boolean BOOLEAN
int INTEGERNUMERICBIGNUMERIC
long INTEGERNUMERICBIGNUMERIC
float FLOAT64NUMERICBIGNUMERIC
double FLOAT64NUMERICBIGNUMERIC
bytes BYTESNUMERICBIGNUMERIC
string STRINGJSONTIMESTAMPDATETIMEDATETIMENUMERICBIGNUMERIC
record RECORD/STRUCT
array/Type REPEATED Type
值类型为 ValueTypemap REPEATED STRUCT <key STRING, value ValueType>
union 有两种类型,一种是 null和其他Type NULLABLE Type
其他 union 无法映射
fixed BYTESNUMERICBIGNUMERIC
enum INTEGER

Avro 逻辑类型

Avro 逻辑类型 BigQuery 数据类型
timestamp-micros TIMESTAMP
date DATE
time-micros TIME
duration INTERVAL
decimal NUMERICBIGNUMERIC

协议缓冲区类型

协议缓冲区类型 BigQuery 数据类型
double FLOAT64NUMERICBIGNUMERIC
float FLOAT64NUMERICBIGNUMERIC
int32 INTEGERNUMERICBIGNUMERICDATE
int64 INTEGERNUMERICBIGNUMERICDATEDATETIMETIMESTAMP
uint32 INTEGERNUMERICBIGNUMERICDATE
uint64 NUMERICBIGNUMERIC
sint32 INTEGERNUMERICBIGNUMERIC
sint64 INTEGERNUMERICBIGNUMERICDATEDATETIMETIMESTAMP
fixed32 INTEGERNUMERICBIGNUMERICDATE
fixed64 NUMERICBIGNUMERIC
sfixed32 INTEGERNUMERICBIGNUMERICDATE
sfixed64 INTEGERNUMERICBIGNUMERICDATEDATETIMETIMESTAMP
bool BOOLEAN
string STRINGJSONTIMESTAMPDATETIMEDATETIMENUMERICBIGNUMERIC
bytes BYTESNUMERICBIGNUMERIC
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_schemause_table_schema 设置为 true 时,BigQuery 订阅支持变更数据捕获 (CDC) 更新。如需将此功能与 use_topic_schema 搭配使用,请使用以下字段设置主题的架构

  • _CHANGE_TYPE(必需):设置为 UPSERTDELETEstring 字段。

    • 如果一条 Pub/Sub 消息写入到 BigQuery 表的 _CHANGE_TYPE 设置为 UPSERT, 如果存在以下情况,BigQuery 将使用相同的键更新该行: 或插入新行(如果不存在)。

    • 如果写入 BigQuery 表的 Pub/Sub 消息将 _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 表并读取表元数据。有关 请参阅将 BigQuery 角色分配给 Pub/Sub 服务 账号

处理消息故障

如果无法将 Pub/Sub 消息写入 BigQuery,则无法确认该消息。要将此类邮件 无法送达的邮件,请配置死信 主题上 BigQuery 订阅。转发到死信主题的 Pub/Sub 消息包含属性 CloudPubSubDeadLetterSourceDeliveryErrorMessage,其中包含 Pub/Sub 消息无法写入 BigQuery 的原因。

如果 Pub/Sub 无法将消息写入 BigQuery,则会以类似于推送延迟行为的方式延迟消息传送。但是,如果 订阅具有 已附加死信主题 因此当消息失败时,Pub/Sub 不会暂停传送 都是由架构兼容性错误造成的

配额和限制

BigQuery 订阅方存在配额限制 每个区域的吞吐量如需了解详情,请参阅 Pub/Sub 配额和限制

BigQuery 订阅使用 BigQuery Storage Write API 写入数据。如需了解 Storage Write API 的配额和限制,请参阅 BigQuery Storage Write API 请求。BigQuery 订阅仅会消耗 Storage Write API 的吞吐量配额。您 可以忽略此实例中的其他 Storage Write API 配额注意事项。

价格

如需了解 BigQuery 订阅的价格,请参阅 Pub/Sub 价格页面

后续步骤