我正在研究beams word count examples(使用python)。我可以在DataflowRunner上运行示例并接收输出。
当前输出文件如下:
itself: 16
grey: 1
senses: 4
repair: 1
me: 228
是否有对PCollection进行排序的方法,以便我的输出文件根据单词频率以降序排序?
在无法执行此操作的情况下,查找最频繁出现的单词的标准工作流程是什么?在Beam将数据减少到字数之后,是否可以通过单独的过程来处理?
答案 0 :(得分:0)
在Beam中,PCollection的元素是无序的。我将结果存储在数据库中并在那里进行排序。
不确定用例以及是否确实有必要在Beam中进行排序,但是一种解决方法是将虚拟键上的所有行分组,使用GroupByKey,然后对分组的数据执行排序,如下所示:< / p>
word_count_list = [
('itself', 16),
('grey', 1),
('senses', 4),
('repair', 1),
('me', 228),
]
def addKey(row):
return (1, row)
def sortGroupedData(row):
(keyNumber, sortData) = row
sortData.sort(key=lambda x: x[1], reverse=True)
return sortData[0:3]
word_count = (p
| 'CreateWordCountColl' >> beam.Create(word_count_list)
| 'AddKey' >> beam.Map(addKey)
| 'GroupByKey' >> beam.GroupByKey()
| 'SortGroupedData' >> beam.Map(sortGroupedData)
| 'Write' >> WriteToText('./sorting_results')
)
这将返回单个行列表中的前3名。
[('me', 228), ('itself', 16), ('senses', 4)]
但是,请考虑放弃对数据集的并行处理。