我正在尝试将一个sql查询实现为数据流中的转换。我从bigquery加载了一个表作为PCollection。我想汇总我的数据,如下面的查询。
SELECT
name,
user_id,
place,
SUM(amount) as some_amount ,
SUM(cost) as sum_cost
FROM
[project:test.day_0_test]
GROUP BY 1,2,3
我如何轻松实现它。我听说带有Java的数据流支持在P Collection上运行sql类查询,但是正确的python不支持。任何人都可以帮我解决这个问题
注意:
我想在P Collection上实现这个查询..不要直接从bigquery读取
答案 0 :(得分:3)
(当你评论不想直接在BigQuery中运行SQL查询时,我编辑了我的答案)
我模拟了包含以下内容的文件input.csv
#input.csv
name1,1,place1,2.,1.5
name1,1,place1,3.,0.5
name1,1,place2,1.,1
name1,2,place3,2.,1.5
name2,2,place3,3.,0.5
这是您从BQ检索的数据。您的SQL查询可以在Beam中实现:
def sum_l(l):
s0, s1 = 0, 0
for i in range(len(l)):
s0 += l[i][0]
s1 += l[i][1]
return [s0, s1]
with beam.Pipeline(options=po) as p:
(p | 'Read Input' >> beam.io.ReadFromText("input.csv")
| 'Split Commas' >> beam.Map(lambda x: x.strip().split(','))
| 'Prepare Keys' >> beam.Map(lambda x: (x[:-2], map(float, x[-2:])))
| 'Group Each Key' >> beam.GroupByKey()
| 'Make Summation' >> beam.Map(lambda x: [x[0], sum_l([e for e in x[1]])])
| 'Write Results' >> beam.io.WriteToText('results.csv'))
结果是:
#results.csv-00000-of-00001
[[u'name1', u'1', u'place2'], [1.0, 1.0]]
[[u'name1', u'2', u'place3'], [2.0, 1.5]]
[[u'name1', u'1', u'place1'], [5.0, 2.0]]
[[u'name2', u'2', u'place3'], [3.0, 0.5]]
它基本上是您的查询的简单MapReduce实现:为每一行构建一个键,它们被组合在一起,并使用函数Map
在sum_l
操作中进行最终求和。
我不确定为什么要在Beam而不是BigQuery中运行查询操作。我建议尝试这两种方法,因为在这种情况下,可能不会像在BigQuery中那样有效。