使用pcollection作为另一个pcollection的输入

时间:2018-02-06 19:02:13

标签: mapreduce google-bigquery google-cloud-dataflow apache-beam

在谷歌数据流中使用python sdk,我想做一个这样的查询:

  

query_a_and_b =“SELECT a,b FROM TableA”

此查询返回我想用来执行更多查询的元组列表:

  

query_param = SELECT * from TableA WHERE a = {} and b = {} .format(a,b)   (这里我设置了TableA,但它也将与TableB,C和D一起使用,它们与TableA内部连接...)

所以我想做的是:

coll = (p
    | 'read a_b_tuples' >> beam.io.Read(beam.io.BigQuerySource(query=query_a_and_b, use_standard_sql=True)) 
    | 'Build SQL' >> beam.Map(lambda x: query_param.format(x['a'], x['b'])) 
    | 'Query pardo' >> beam.ParDo(lambda q: [beam.io.Read(beam.io.BigQuerySource(query=q, use_standard_sql=True))])
    | 'Save' >> beam.io.WriteToText('results.csv')
)

我不确定最好的方法,但它不起作用。在数据流中实现此目的的首选方法是什么?

最终,每个查询都会返回少量行(小于5k),我想在pandas数据帧中加载进行过滤/处理,然后将所有TableA,B,C,D组合在一起元组(a,b)并将每个元组datafarm写入csv文件的结果。

我可能在某种意义上将地图缩小了问题,我可以使用光束函数按a和b进行分组然后进行处理......?

1 个答案:

答案 0 :(得分:4)

Beam还没有直接支持BigQuery。一些其他变换支持类似的用例,例如JdbcIO.readAll()可以在数据库中查询查询参数集合,TextIO.readAll()可以读取文件名集合 - 但BigQueryIO尚未执行此操作,Java和Python SDK中都没有

在您的"查询pardo"中,您可以明确地与BigQuery REST API对话 - 它应该没问题,因为您的查询会返回少量结果。