Skip to main content
 首页 » 编程设计

python之在一个 Dataflow 作业中写入和读取 BigQuery

2025年05月04日28jackei

在为 Dataflow 构建管道时,我遇到了一个看似简单的问题。我有多个从外部源获取数据、转换数据并将其写入多个 BigQuery 表的管道。完成此过程后,我想运行一个查询来查询刚刚生成的表。理想情况下,我希望在同一份工作中发生这种情况。

这是 Dataflow 的使用方式,还是应该在作业之间拆分加载到 BigQuery 和查询表?

如果这在同一个工作中是可能的,那么如何解决这个问题,因为 BigQuerySink 不会生成 PCollection?如果这在同一个作业中是不可能的,是否有某种方法可以在另一个作业(即写入作业和查询作业)完成时触发一个作业?

请您参考如下方法:

您提到了在单个作业中执行此操作需要发生什么 -- BigQuerySink 需要生成一个 PCollection。即使它是空的,您也可以将它用作从 BigQuery 读取的步骤的输入,使该步骤等待第一个接收器完成。

您需要创建自己的 BigQuerySink 版本才能执行此操作。

如果可能,一个更简单的选择可能是让第二步从您写入 BigQuery 的集合中读取,而不是读取您刚刚放入 BigQuery 的表。例如:

PCollection<TableRow> rows = ...; 
rows.apply(BigQuery.Write.to(...)); 
rows.apply(/* rest of the pipeline */); 

如果您想继续处理写入 BigQuery 的元素而不是表行,您甚至可以更早地执行此操作。