使用数据流在对象上使用GroupByKey?

时间:2019-04-28 18:20:59

标签: python google-cloud-dataflow apache-beam

我正在通过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的新手,所以我非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

一个答案是要意识到您的每条记录都可以描述为:

  • 键:pollId + answerId
  • 值:1 // The vote

因此,如果您有一个具有此形式的键/值对的PCollection,则可以对该集合执行CombinePerKey(sum),该集合将使用相同的键聚合所有项,并将其值相加,从而得到一个新的PCollection,由新的键/值对组成,其中它们的值是具有相同pollIdanswerId的所有记录的总和。

例如,请参见CombinePerKey Python文档,以了解此功能的用法。