我是Google云数据平台以及Apache Beam API的新手。我想基于多个键聚合数据。根据我的要求,我将获得一个包含客户ID,客户名称,交易金额和交易类型等字段的交易Feed。我想根据客户ID和交易类型汇总数据。这是一个例子。
customer id,customer name,transction amount,transaction type
cust123,ravi,100,D
cust123,ravi,200,D
cust234,Srini,200,C
cust444,shaker,500,D
cust123,ravi,100,C
cust123,ravi,300,C
O/p should be
cust123,ravi,300,D
cust123,ravi,400,C
cust234,Srini,200,C
cust444,shaker,500,D
在google中,大多数示例都是基于单个键,例如按单个键分组。请问有什么可以帮助我了解我的PTransform的外观以及如何生成聚合数据以及其余字段的信息。
关于, 拉维。
答案 0 :(得分:0)
这是一个简单的方法。我将所有键连接在一起形成一个键,然后对子键进行了操作,然后对键进行了拆分,以将输出组织为所需的方式。如有任何问题,请告诉我。
该代码不应在CSV文件中包含标题。我只是简短地说明了您要问的要点。
import apache_beam as beam
import sys
class Split(beam.DoFn):
def process(self, element):
"""
Splits each row on commas and returns a tuple representing the row to process
"""
customer_id, customer_name, transction_amount, transaction_type = element.split(",")
return [
(customer_id +","+customer_name+","+transaction_type, float(transction_amount))
]
if __name__ == '__main__':
p = beam.Pipeline(argv=sys.argv)
input = 'aggregate.csv'
output_prefix = 'C:\\pythonVirtual\\Mycodes\\output'
(p
| 'ReadFile' >> beam.io.ReadFromText(input)
| 'parse' >> beam.ParDo(Split())
| 'sum' >> beam.CombinePerKey(sum)
| 'convertToString' >>beam.Map(lambda (combined_key, total_balance): '%s,%s,%s,%s' % (combined_key.split(",")[0], combined_key.split(",")[1],total_balance,combined_key.split(",")[2]))
| 'write' >> beam.io.WriteToText(output_prefix)
)
p.run().wait_until_finish()
它将产生如下输出:
cust234,Srini,200.0,C
cust444,shaker,500.0,D
cust123,ravi,300.0,D
cust123,ravi,400.0,C