我有一个词典的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}]]
然后我被卡住了,因为我无法看到如何对此列表进行分区并进行组合以获得最终结果。
你知道最简单的方法吗?
提前致谢
答案 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.GroupByKey
和beam.Map(lambda kv : (kv[0], sum(kv[1])))
。您也可以beam.CombineValues(lambda x,y : x + y)
。