Spark -使用JavaPairRDD按值排序

bwleehnv  于 2023-04-21  发布在  Apache
关注(0)|答案(4)|浏览(102)

使用Java处理apache spark。我得到了一个JavaPairRDD<String,Long>,我想按它的值对这个数据集进行排序。但是,它似乎只有sortByKey方法。我如何按Long类型的值对它进行排序?

anauzrmj

anauzrmj1#

dataset.mapToPair(x -〉x.swap()).sortByKey(false).mapToPair(x -〉x.swap()).take(100)

r6hnlfcb

r6hnlfcb2#

Spark还不支持'Secondary sort'(详情请参阅SPARK-3655)。
作为一种解决方法,您可以通过交换键值<->并按键进行排序来按值进行排序。
在Scala中是这样的:

val kv:RDD[String, Long] = ??? 
// swap key and value
val vk = kv.map(_.swap)
val vkSorted = vk.sortByKey
9wbgstp7

9wbgstp73#

我使用List完成了这一操作,它现在有一个sort(Comparator c)方法
List<Tuple2<String,Long>> touples = new ArrayList<>(); touples.addAll(myRdd.collect()); // touples.sort((Tuple2<String, Long> o1, Tuple2<String, Long> o2) -> o2._2.compareTo(o1._2));
它比@Atul解决方案更长,我不知道性能是否更好,在500个项目的RDD上没有区别,我想知道它如何与一百万条记录的RDD一起工作。您也可以使用Collections.sort并传入collect和基于lambda的Comparator提供的列表

2guxujil

2guxujil4#

JavaPairRDD<String, Long> sorted = reduce.mapToPair(tuple -> new Tuple2<Long, String>(tuple._2, tuple._1))
                    .sortByKey(false)
                    .mapToPair(tuples -> new Tuple2<>(tuples._2, tuples._1));

使用mapToPair交换,然后排序,然后再次交换。

相关问题