Apache flink 从多个已排序分区获取前n个元素

Apache flink 从多个已排序分区获取前n个元素,apache-flink,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") 问题

我想读多个文件,计算重复行数,按重复次数对行排序,取前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个first元素


有没有一种方法可以从所有分区中选择排序后的前n个元素而不将并行度降低到1?

我将使用并行
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
将非常简单。当计数器降到
0
时,它只需倒计时要转发多少条记录,并从
mapPartition()函数返回多少条记录