我如何将PCollection转换为python数据流中的列表

时间:2018-01-08 20:56:43

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

我有一个包含ID字段的PCollection $request->getUser()。我想从PCollection中获取完整的ID列作为列表,并将此值传递给BigQuery查询以过滤一个BigQuery表。

这样做最快,最优化的方法是什么?

我是Dataflow和BigData的新手。任何人都可以提供一些暗示吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

对于我从您的问题中理解的内容,您希望根据P1中的ID来构建SQL语句。这是如何实现这一目标的一个例子:

sql = """select ID from `table` WHERE ID IN ({})"""
with beam.Pipeline(options=StandardOptions()) as p:
         (p | 'Create' >> beam.Create(['1', '2', '3']) 
            | 'Combine' >> beam.combiners.ToList()
            | 'Build SQL' >> beam.Map(lambda x: sql.format(','.join(map(lambda x: '"' + x + '"', x))))
            | 'Save' >> beam.io.WriteToText('results.csv'))

结果:

select ID from `table` WHERE ID IN ("1","2","3")

操作beam.combiners.ToList()将您的整个PCollection数据转换为单个列表(我后来用它来注入SQL占位符)。

您现在可以使用文件results.csv-00000-to-000001中的SQL来针对BQ运行此查询。

我不确定是否可以直接在PCollection中运行此查询(类似(p | all transformations | beam.io.Write(beam.io.BigQuerySink(result sql)))。我想从最终结果文件中读取,然后针对BQ发出查询将是最好的方法。