Apache Beam 管道查询 Table 写入后 Table

Apache Beam Pipeline Query Table After Writing Table

我有一个正在将结果写入 BigQuery table 的 Apache Beam/Dataflow 管道。然后我想查询此 table 以获取管道的单独部分。但是,我似乎无法弄清楚如何正确设置此管道依赖项。我写的新 table(然后想查询)与单独的 table 相连,用于某些过滤逻辑,这就是为什么我实际上需要写 table 然后 运行查询。逻辑如下:

with beam.Pipeline(options=pipeline_options) as p:
    table_data = p | 'CreatTable' >> # ... logic to generate table ...

    # Write Table to BQ
    table_written = table_data | 'WriteTempTrainDataBQ' >> beam.io.WriteToBigQuery(...)

    query_results = table_written | 'QueryNewTable' >> beam.io.Read(beam.io.BigQuerySource(query=query_new_table))

if query_new_table 实际上是对已经存在的 BQ table 的查询,我改为 query_results = p | 而不是 table_written 这可以正常工作。但是,如果我尝试查询我在管道中间编写的 table,那么在实际生成 table 之前,我无法将管道步骤转到 "wait"。有什么方法可以做到这一点我忽略了吗?

当我尝试按顺序执行此步骤时,我收到一个断言错误 assert isinstance(pbegin, pvalue.PBegin) AssertionError,我正在阅读这意味着 table_written 是问题,因为它不是有效的 PCollection 实例。

有谁知道我可以用什么来代替 table_written 来让这个 运行 真正地按照需要按顺序排列?

Beam 当前不支持用例 "do something after a BigQuery write is complete"。唯一的解决方法是 运行 单独的管道:让您的主程序是:运行 写入 BigQuery 的管道;等待管道完成; 运行 另一个从 BigQuery 读取的管道。

这是一个非常频繁请求的功能,我们开始设计这种支持(更一般地说,升级各种 IO 写入以支持它们之后的排序操作),但我不知道我们什么时候能完成。