2

我有一个 Dataflow 管道,它从 PubSub Lite 读取消息并将数据流式传输到 BigQuery 表中。该表按天分区。查询表时:

SELECT * FROM `my-project.my-dataset.my-table` WHERE DATE(timestamp) = "2021-10-14"

BigQuery UI 告诉我This query will process 1.9 GB when run。但是当实际运行查询时,我没有得到任何结果。我的管道现在运行了一整周,过去两天我得到了相同的结果。然而,2021-10-11在那之前的几天里,我看到了实际的结果。

我目前正在使用 Apache Beam 2.26 版,我的数据流编写器如下所示:

return BigQueryIO.<Event>write()
    .withSchema(createTableSchema())
    .withFormatFunction(event -> createTableRow(event))
    .withCreateDisposition(CreateDisposition.CREATE_NEVER)
    .withWriteDisposition(WriteDisposition.WRITE_APPEND)
    .withTimePartitioning(new TimePartitioning().setType("DAY").setField("timestamp"))
    .to(TABLE);

为什么 BigQuery 将值提交到分区需要这么长时间,但同时告诉我实际上有可用数据?

编辑1:

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

0

BigQuery 正在处理数据并且不返回任何行,因为它还处理流缓冲区中的数据。缓冲区上的数据最多可能需要 90 分钟才能提交到分区表中。

查看此堆栈以及此处提供的文档中的更多详细信息。

When streaming to a partitioned table, data in the 
streaming buffer has a NULL value for the _PARTITIONTIME pseudo column.

如果您在 BigQuery 中从 pubsub 写入数据时遇到问题,我建议您使用数据流中可用的模板。

使用 GCP 中可用的 Dataflow 模板将数据从 PubSub 写入 BigQuery:

有一种将 pubsub 主题中的数据写入 bigquery 的方法,并且它已经处理了可能的极端情况。

我按以下方式对其进行了测试,并且效果很好:

  • subscription在你身上创造一个PubSub topic
  • 创建bucket用于临时存储;
  • 创建作业如下: 在此处输入图像描述
  • 为了测试,我只是以json格式向主题发送了一条消息,并将新数据添加到输出表中:

gcloud pubsub topics publish test-topic --message='{"field_dt": "2021-10-15T00:00:00","field_ts": "2021-10-15 00:00:00 UTC","item": "9999"}'

在此处输入图像描述

如果您想要更复杂的东西,您可以从github的模板代码中分叉并根据需要进行调整。

于 2021-10-15T12:04:50.883 回答