在为 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 的元素而不是表行,您甚至可以更早地执行此操作。
