使用Java处理apache spark。我得到了一个JavaPairRDD<String,Long>,我想按它的值对这个数据集进行排序。但是,它似乎只有sortByKey方法。我如何按Long类型的值对它进行排序?
Java
apache spark
JavaPairRDD<String,Long>
sortByKey
Long
anauzrmj1#
dataset.mapToPair(x -〉x.swap()).sortByKey(false).mapToPair(x -〉x.swap()).take(100)
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
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提供的列表
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));
Collections.sort
collect
Comparator
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交换,然后排序,然后再次交换。
4条答案
按热度按时间anauzrmj1#
dataset.mapToPair(x -〉x.swap()).sortByKey(false).mapToPair(x -〉x.swap()).take(100)
r6hnlfcb2#
Spark还不支持'Secondary sort'(详情请参阅SPARK-3655)。
作为一种解决方法,您可以通过交换键值<->并按键进行排序来按值进行排序。
在Scala中是这样的:
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
提供的列表2guxujil4#
使用mapToPair交换,然后排序,然后再次交换。