JavaPairRDD<String, Float> counts = ones
.reduceByKey(new Function2<Float, Float, Float>() {
@Override
public Float call(Float i1, Float i2) {
return i1 + i2;
}
});
我的输出如下:
id,value
100002,23.47
100003,42.78
200003,50.45
190001,30.23
我希望输出按值排序,如:
200003,50.45
100003,42.78
190001,30.23
100002,23.47
我如何实现这一目标?
答案 0 :(得分:3)
我认为没有特定的API来对数据进行排序。
您可能需要执行以下步骤:
1)交换键和值
2)使用sortByKey API
3)交换键和值
在beloe参考中查看有关sortByKey的更多详细信息:
https://spark.apache.org/docs/1.0.0/api/java/org/apache/spark/api/java/JavaPairRDD.html#sortByKey%28boolean%29
对于swap,我们可以使用Scala Tuple API:
http://www.scala-lang.org/api/current/index.html#scala.Tuple2
例如,我从下面的函数中获得了Java Pair RDD。
JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer i1, Integer i2) {
return i1 + i2;
}
});
现在,要交换键和值,您可以使用以下代码:
JavaPairRDD<Integer, String> swappedPair = counts.mapToPair(new PairFunction<Tuple2<String, Integer>, Integer, String>() {
@Override
public Tuple2<Integer, String> call(Tuple2<String, Integer> item) throws Exception {
return item.swap();
}
});
希望这会有所帮助。您需要处理数据类型。
答案 1 :(得分:3)
Scala有一个很好的sortBy
方法。找不到Java等价物,但这是scala实现:
def sortBy[K](
f: (T) => K,
ascending: Boolean = true,
numPartitions: Int = this.partitions.size)
(implicit ord: Ordering[K], ctag: ClassTag[K]): RDD[T] =
this.keyBy[K](f)
.sortByKey(ascending, numPartitions)
.values
所以,基本上与上面类似,但它添加了一个键而不是向前和向后交换。我像这样使用它:.sortBy(_._2)
(通过选择元组的第二个元素来排序)。