在BigQueryIO.write()操作之后执行一个进程

时间:2017-10-03 11:36:27

标签: google-cloud-dataflow apache-beam

我有一个带有BigQuery表的管道作为接收器。在将数据写入BigQuery之后,我需要完全执行一些步骤。这些步骤包括对该表执行查询,从中读取数据并写入另一个表。

如何实现上述目标?我应该为后者创建一个不同的管道,但是在第一个管道之后调用它将是我假设的另一个问题。

如果以上都不起作用,是否可以从正在运行的管道调用另一个数据流作业(模板)。

真的需要一些帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

BigQueryIO目前尚未明确支持此功能。唯一的解决方法是使用单独的管道:启动第一个管道,等待它完成(例如使用pipeline.run().waitUntilFinish()),启动第二个管道(确保为它使用单独的Pipeline对象 - 重用相同的对象不支持多次)。

答案 1 :(得分:0)

我一直在使用 templates 的一种解决方法是将IO操作的结果写入元数据文件到特定的存储区(即云函数)(即我的 orchestrator )被触发,然后触发以下管道。但是,我仅使用TextIO操作对其进行了测试。 因此,就您而言:

  • 执行BigQueryIO.write()操作
  • 将其结果写入文件(xxx-meta-file)到Cloud Storage存储桶(xxx-meta-bucket)中,在其中仅保留数据流结果-这是管道的最后一步
  • 编写一个协调器云函数,以侦听xxx-meta-bucket中创建/修改的对象(请参见here
  • 在协调器中,您可能需要一些条件来检查实际创建/修改的文件
  • 相应地触发下一个管道(直接在协调器中或通过触发另一个负责启动该特定管道的云功能将其解耦)

可以肯定,可以使用PubSub轻松复制类似的方法,而不用写入存储桶(例如,列表中的第二步,请参见here