如何在PCollection中合并数据-Apache Beam

时间:2019-06-14 12:55:57

标签: java apache-beam apache-beam-io

我正在寻找在PCollection中合并数据

输入的是CSV文件

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应该是

在将文本文件读入对象集合之后,我想合并为显示的输出。

cust123,ravi,300,D  
cust123,ravi,400,C  
cust234,Srini,200,C  
cust444,shaker,500,D
Pipeline pipeline = Pipeline.create(
   PipelineOptionsFactory.fromArgs(args).withValidation().create());

PCollection< Customer> pCollection =
   pipeline.apply("Read", TextIO.read().from("MyFile.csv"))
           .apply("splitData and store",
               ParDo.of(new TextTransform.SplitValues()))

1 个答案:

答案 0 :(得分:1)

如果我理解正确,则需要对按customerid + transaction类型分组的交易金额求和。在这种情况下,您需要从较高的角度来看:

  • 将键分配给记录:
    • 您可以为此使用WithKeys PTransform see the doc
    • 密钥由您决定,例如,您可以将客户ID与交易类型(例如csvField[0] + "," + csvField[3]
    • )结合使用
  • 使用GroupByKey PTransformsee this doc通过新密钥对记录进行分组;
  • GBK的输出将是具有相同键的记录的集合,因此您需要应用ParDo来接受这样的集合(所有记录属于同一客户和交易类型),总和增加金额,并输出总金额的记录;

可以通过使用Combine.perKey() PTransform代替最后两个步骤(GBK + ParDo),该步骤具有相同的作用,但可以在运行时进行优化。有关更多信息,请参见thisthis

您还可以研究Beam SQL,该方法允许您在SQL中表达相同的逻辑。有关Beam SQL的概述,请参见this doc。在这种情况下,您需要添加一个ParDo才能在应用SqlTransform之前将CSV记录转换为Beam Rows。