多个表的Pcollection

时间:2018-05-19 16:10:48

标签: java google-bigquery google-cloud-dataflow

我有两个bigquery表。

表A

c_id    count_c_id  p_id

表B

id   c_name   p_type  c_id 

根据表A中的列,我需要使用DF管道从表B中查找详细信息。

PCollection<TableRow> tableRowBQ = pipeline.apply(BigQueryIO.Read
.named("Read").fromQuery("select c_id,count_c_id,p_id from TableA"));

我的要求是基于此查询的c_id返回我应该能够使用pcollection从TableB获取c_name。我无法找到任何pcollection示例来迭代一个表中的字段,并使用该字段从另一个表中获取数据。

Google小组分享的示例作为参考。 https://github.com/GoogleCloudPlatform/DataflowSDK-examples/blob/master-1.x/src/main/java/com/google/cloud/dataflow/examples/cookbook/JoinExamples.java

1 个答案:

答案 0 :(得分:1)

Cloud DataFlow documentation开始,我认为您有两种方法可以完成这种 JOIN 任务。根据您拥有的唯一c_id的数量,我会选择以下两个选项之一。

  • 如果您没有多个c_id,我会将您的SELECT查询的结果视为副输入,并将其作为过滤器传递到表B的查找中;

以下是使用BigQueryIO查询结果作为旁边输入的代码段:Apply Side input to BigQueryIO.read operation in Apache Beam

  • 否则,您可以使用CoGroupByKey。例如,
Table A:
c_id -> count_c_id, p_id

Table B
c_id -> c_name

由于两个表都可以看作是某些不同值的共享键,因此您可以 CoGroup 将它们转换为

c_id -> ([count_c_id, p_id], [c_name]]

然后你可以做任何你想做的事情&#34;分组&#34;新的PCollection。