排序apache梁wordcount_minimal输出

时间:2018-09-19 03:36:35

标签: python apache-beam

我正在研究beams word count examples(使用python)。我可以在DataflowRunner上运行示例并接收输出。

当前输出文件如下:

itself: 16
grey: 1
senses: 4
repair: 1
me: 228

是否有对PCollection进行排序的方法,以便我的输出文件根据单词频率以降序排序?

在无法执行此操作的情况下,查找最频繁出现的单词的标准工作流程是什么?在Beam将数据减少到字数之后,是否可以通过单独的过程来处理?

1 个答案:

答案 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)]

但是,请考虑放弃对数据集的并行处理。