Google bigquery 在PCollection上使用python在数据流内执行sql查询

Google bigquery 在PCollection上使用python在数据流内执行sql查询,google-bigquery,google-cloud-dataflow,apache-beam,dataflow,Google Bigquery,Google Cloud Dataflow,Apache Beam,Dataflow,我正试图实现一个sql查询作为数据流中的转换。我从bigquery加载了一个表作为PCollection。我想像下面的查询一样聚合我的数据 选择 名称 用户id, 地点,, 作为某个金额的总和(金额), 总和(成本)作为总和成本 从…起 [项目:测试。第0天测试] 按1,2,3分组 我如何轻松地实现它。我听说Java数据流支持在P集合上运行sql类查询,但python不支持。有人能帮我解决这个问题吗 注: 我想在p集合上实现此查询。。不直接从bigquery中读取(我编辑了我的答案,因为您评论

我正试图实现一个sql查询作为数据流中的转换。我从bigquery加载了一个表作为PCollection。我想像下面的查询一样聚合我的数据

选择
名称
用户id,
地点,,
作为某个金额的总和(金额),
总和(成本)作为总和成本
从…起
[项目:测试。第0天测试]
按1,2,3分组
我如何轻松地实现它。我听说Java数据流支持在P集合上运行sql类查询,但python不支持。有人能帮我解决这个问题吗

注:


我想在p集合上实现此查询。。不直接从bigquery中读取(我编辑了我的答案,因为您评论说不想直接在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实现:为每一行构建一个键,将它们分组在一起,并使用函数
sum\l
Map
操作中进行最终求和


我不知道为什么要在Beam中运行查询操作,而不是在BigQuery中运行。我建议尝试这两种方法,因为在这种情况下,在Beam中可能无法像在BigQuery中那样高效。

我想在PCOllection上实现此查询。不要直接阅读bigquery我只是编辑了我的答案,以便在Python Beam操作中实现SQL查询,希望这就是您要寻找的。我们可以将p集合保存为变量以备将来使用吗?当然,只需将结果分配给另一个变量,例如:
other_po=(p | transforms…
。然后,您可以使用
other\u po
进行未来的转换Hanks Willian。现在我想合并两个P集合-就像从一个P集合中一样,我必须获取id并在第二个P集合中获取相应的行-我如何使用python(来自PCollection1的id,(来自PCollection2的id,value1,value2,value3)执行此联接操作?您需要使用
GroupByKey
。请看这里: