我正在寻找在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()))
答案 0 :(得分:1)
如果我理解正确,则需要对按customerid + transaction类型分组的交易金额求和。在这种情况下,您需要从较高的角度来看:
WithKeys
PTransform
see the doc; csvField[0] + "," + csvField[3]
GroupByKey
PTransform
,see this doc通过新密钥对记录进行分组; ParDo
来接受这样的集合(所有记录属于同一客户和交易类型),总和增加金额,并输出总金额的记录; 可以通过使用Combine.perKey()
PTransform
代替最后两个步骤(GBK + ParDo),该步骤具有相同的作用,但可以在运行时进行优化。有关更多信息,请参见this和this。
您还可以研究Beam SQL,该方法允许您在SQL中表达相同的逻辑。有关Beam SQL的概述,请参见this doc。在这种情况下,您需要添加一个ParDo
才能在应用SqlTransform
之前将CSV记录转换为Beam Rows。