从多个已排序的分区中获取前n个元素

时间:2016-12-14 17:55:54

标签: apache-flink

我想读取多个文件,计算重复行数,按重复次数对行进行排序,前10条重复行。

lines = env.readTextFile("logs-dir")
tuples = lines.map(line -> Tuple2(line, 1))
aggregate = tuples.groupBy(0).sum(1)
sort = aggregate.sortPartition(1, Order.DESCENDING)
sorted.first(10).writeAsText("domains")

问题是first-n是任意的,并从所有分区中返回10个第一个元素。

有没有办法从所有分区中选择排序的前n个元素,而不会将并行度降低到1?

1 个答案:

答案 0 :(得分:2)

我会用并行MapPartitionFunction来解决这个问题,它返回每个分区的前10个元素,将结果发送到单个分区,对其进行排序并再次获取前10个分区。这看起来像这样:

lines = env.readTextFile("logs-dir")
tuples = lines.map(line -> Tuple2(line, 1))
aggregate = tuples.groupBy(0).sum(1)

// sort partitions in parallel
sortPart = aggregate.sortPartition(1, Order.DESCENDING)
// take first 10 of each partition
firstPart = sortPart.mapPartition(new First(10))

// sort all in one partition
sortFull = firstPart.sortPartition(1, Order.DESCENDING).parallelism(1)
// take first 10
first10 = sortFull.mapPartition(new First(10))
first10.writeAsText("domains")

MapPartitionFunction First非常简单。只需计算一下,当计数器降至mapPartition()时,转发的记录数将从0函数返回并返回。