我想读取多个文件,计算重复行数,按重复次数对行进行排序,前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?
答案 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
函数返回并返回。