我有一个包含ID字段的PCollection $request->getUser()
。我想从PCollection中获取完整的ID列作为列表,并将此值传递给BigQuery查询以过滤一个BigQuery表。
这样做最快,最优化的方法是什么?
我是Dataflow和BigData的新手。任何人都可以提供一些暗示吗?
谢谢!
答案 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发出查询将是最好的方法。