如何使用在Dataflow执行期间计算的模式写入BigQuery?

时间:2015-04-03 22:01:42

标签: google-cloud-dataflow

我有以下情况:

      
  1. 管道A在BigQuery中查找表A,进行一些计算并返回列名列表。   
  2. 此列名列表用作管道B输出的BigQuery架构。

请告诉我,实现这一目标的最佳选择是什么?

管道A可以使用TextIO将列名列表写入临时或临时位置文件,然后由管道执行器读取以定义管道B的架构。如果这种方法看起来不错,请告诉我是否可以告诉我有一个Dataflow实用程序可以从临时或临时位置读取文件,或者是否应该使用GCS API。

2 个答案:

答案 0 :(得分:5)

您需要执行以下操作:

      
  1. 构造管道A以写入某些位置(例如GCS)(在构造管道B时可以参考的任何持久位置都可以)。   
  2. 使用BlockingDataflowPipelineRunner运行并等待直到管道A完成。   
  3. 通过读取您在步骤1中定义的位置,使用架构信息构建管道B.   
  4. 运行管道B.

我不会使用临时位置,因为我们可能会在您构建管道B之前将其清理干净。可以使用暂存位置(如果与临时位置不同)。我还建议使用一个唯一的文件名,这样如果Pipeline A运行多次,你就不会在管道B中读取陈旧的结果。

这可以帮助您阅读和写入GCS: https://github.com/GoogleCloudPlatform/DataflowJavaSDK/blob/master/sdk/src/main/java/com/google/cloud/dataflow/sdk/util/GcsUtil.java

您可以从PipelineOptions对象获取GcsUtil的实例: https://github.com/GoogleCloudPlatform/DataflowJavaSDK/blob/master/sdk/src/main/java/com/google/cloud/dataflow/sdk/options/GcsOptions.java#L43

答案 1 :(得分:1)

最新版本的Apache Beam可以实现这一点。请在Writing different values to different BigQuery tables in Apache Beam处通过自我回答查看我的更一般性问题。