如何使用具有多个键的Apache Beam API聚合数据

时间:2018-11-12 12:02:46

标签: google-cloud-dataflow

我是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的外观以及如何生成聚合数据以及其余字段的信息。

关于, 拉维。

1 个答案:

答案 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