在Javardd排序

时间:2014-11-26 14:43:02

标签: java apache-spark

我用java来嘲笑火花。我想对我的地图进行排序。事实上,我有这样的javaRDD:

JavaPairRDD<String, Integer> rebondCountURL = session_rebond_2.mapToPair(new PairFunction<Tuple2<String, String>, String, String>() {
        @Override
        public Tuple2<String, String> call(Tuple2<String, String> stringStringTuple2) throws Exception {
            return new Tuple2<String, String>(stringStringTuple2._2, stringStringTuple2._1);
        }
    }).groupByKey().map(new PairFunction<Tuple2<String, Iterable<String>>, Tuple2<String, Integer>>() {
        @Override
        public Tuple2<String, Integer> call(Tuple2<String, Iterable<String>> stringIterableTuple2) throws Exception {
            Iterable<String> strings = stringIterableTuple2._2;
            List<String> b = new ArrayList<String>();
            for (String s : strings) {
                b.add(s);
            }
            return new Tuple2<String, Integer>(stringIterableTuple2._1, b.size());
        }
    });

我想使用Sortby对此Java Rdd进行排序(以便使用Integer进行排序)。

你可以帮我做一下吗?

提前谢谢你。

3 个答案:

答案 0 :(得分:14)

您需要创建一个从每个元素中提取排序键的函数。我们的代码示例

final JavaRDD<Something> stage2 = stage1.sortBy( new Function<Something, Long>() {
  private static final long serialVersionUID = 1L;

  @Override
  public Long call( Something value ) throws Exception {
    return value.getTime();
  }
}, true, 1 );

答案 1 :(得分:0)

只是与sortBy()相关的提示..如果要对一组用户定义的对象进行排序,请说Point然后实现Comparable&lt; Point&gt; Point中的接口并覆盖compareTo()方法,您可以在其中编写自己的逻辑进行排序。在此之后,sortby函数将负责排序逻辑。

注意:您的Point类还必须实现java.io.Serializable接口,否则您将遇到NotSerializable异常。

答案 2 :(得分:0)

这是基于@Vignesh建议的代码。您可以sortBy的{​​{1}}的任何自定义实现。最好单独编写比较器,并在火花代码中使用引用:

Comparator

因此,比较器如下所示:

 rdd ->{JavaRDD<MaxProfitDto> result = 
        rdd.keyBy(Recommendations.profitAsKey)
        .sortByKey(new CryptoVolumeComparator())
        .values()