我正在通过apache-beam写一个简单的python管道来汇总用户投票。
在输入中,我有这样的逗号分隔行:
pollA,answerB
pollA,answerC
pollB,answerA
pollB,answerB
pollC,answerE
pollA,answerB
接下来,我正在使用ParDo函数将每一行转换成这样的对象:
输出:
{
pollId: pollA,
answerId: answerB,
votes: 1
}
功能
:class Split(beam.DoFn):
def process(self, element):
pollId, answerId = element.split(",")
return [{
'pollId': pollId,
'answerId': answerId,
'votes': 1
}]
现在,假设我有3个 answerB ,我想按answerId对它们进行分组并计数以输出类似的内容:
{
pollId: pollA,
answerId: answerB,
votes: 3
}
我是python和apache-beam的新手,所以我非常感谢您的帮助:)
答案 0 :(得分:1)
一个答案是要意识到您的每条记录都可以描述为:
pollId + answerId
1 // The vote
因此,如果您有一个具有此形式的键/值对的PCollection,则可以对该集合执行CombinePerKey(sum)
,该集合将使用相同的键聚合所有项,并将其值相加,从而得到一个新的PCollection,由新的键/值对组成,其中它们的值是具有相同pollId
和answerId
的所有记录的总和。
例如,请参见CombinePerKey Python文档,以了解此功能的用法。