在Apache Beam中拆分句子并组合单词

时间:2018-03-01 16:14:25

标签: python apache-beam

我有一个词典的PCollection:

{'sentence': 'foo bar', 'value' : 5 }
{'sentence': 'one bar', 'value' : 2 }

我想空格分割句子,为句子的每个单词赋予相同的值,然后用sum函数按字汇总。我想要的输出是:

{'word': 'foo', 'value' : 5}
{'word': 'bar', 'value' : 7}
{'word': 'one', 'value' : 2}

我定义了一个分割句子的函数,并返回每个句子的dicts列表:

def word_dicts(row):
 words = row['sentence'].split(' ')
 return [{'word' : word, 'value' : row['value'] } for word in words]

我将此功能放在beam.Map中,然后我使用beam.CombineGlobally(beam.combiners.ToListCombineFn())获取所有双关语列表的列表

[[{'word': 'foo', 'value' : 5},{'word': 'bar', 'value' : 5}],[{'word': 'foo', 'value' : 5},{'word': 'one', 'value' : 2}]]

然后我被卡住了,因为我无法看到如何对此列表进行分区并进行组合以获得最终结果。

你知道最简单的方法吗?

提前致谢

1 个答案:

答案 0 :(得分:2)

beam.Map对于一对一转换很有用,但在这里您需要进行一对多转换的beam.FlatMap

word_dicts需要返回元组列表(见下文),beam.Map(word_dicts)可以替换为beam.FlatMap(word_dicts)

def word_dicts(row):
  words = row['sentence'].split(' ')
  return [(word, row['value']) for word in words]

其余部分应与wordcount示例非常相似。 您可以应用beam.GroupByKeybeam.Map(lambda kv : (kv[0], sum(kv[1])))。您也可以beam.CombineValues(lambda x,y : x + y)