如何在spark java中实现按值排序

时间:2015-03-12 06:32:26

标签: java sorting apache-spark

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

我如何实现这一目标?

2 个答案:

答案 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)(通过选择元组的第二个元素来排序)。