これをJavaで、そしてRDD APIを使用するだけで解決する必要があります。Apache Spark(Java)の複数の値でJavaRDDタプルを並べ替えます。
私は4つの値を持つJavaRDD
タプル持っている:私は降順でダブル値でタプルをソートしたい
JavaRDD<Tuple4 <Integer, Double, Long, Integer>> revenue = ...;
を。
2つのDoublesの値が同じ場合は、Long値で昇順にソートします。例えばので
は:
class TupleComparator implements Comparator<Tuple4<Integer, Double, Long, Integer>>, Serializable {
private static final long serialVersionUID = 1L;
@Override
public int compare(Tuple4<Integer, Double, Long, Integer> v1,
Tuple4<Integer, Double, Long, Integer> v2) {
if(v1._2().compareTo(v2._2()) == 0){
return v1._3().compareTo(v2._3());
}
return - v1._2().compareTo(v2._2());
}
}
しかし、順番に:これまでのところ私はこのようなカスタムComparator
を使用しようとした
(1, 5.1, 7, 10)
(1, 4.3, 4, 2)
(7, 4.3, 5, 9)
(3, 4.3, 8, 5)
(8, 1.2, 4, 7)
:
(7, 4.3, 5, 9)
(1, 5.1, 7, 10)
(8, 1.2, 4, 7)
(1, 4.3, 4, 2)
(3, 4.3, 8, 5)
にソートされていますカスタムコンパレータを使用するには、sortByKey関数を使用する必要があります。
私はキーを作る必要があります。 (通常のsortBy関数はコンパレータをとらないので)。
私は、このように私のコンパレータを適用しようとした場合:
revenue.keyBy(x -> x._2()).groupByKey().sortByKey(new TupleComparator(), false, 1);
私が手: "メソッドsortByKeyを...(int型、TupleComparator、ブール値)の引数には適用されません"
これは私が立ち往生している場所です。私がやっていることが正しかったのか、それともコンパレータの働きをするのかは分かりません。 (私はカスタムコンパレータに慣れていません)。
これを実現するにはもっと良い方法がありますか?私はそれがScalaでもっと簡単であることを知っています。
しかし、私はJavaで、そしてRDD APIを使用するだけでそれを行う必要があります。
のためであるあなたは、 'JavaRdd.sortBy'を使用し、最初の値' '-1 Tuple2'を返す関数を渡すことはできません*値2番目の値は 'value._3()'です。 –
それは実際には素晴らしいと簡単なアイデアです。ありがとうございました! – Rhyzx