2016-09-23 10 views
1

スパークでは、2つの異なるフィールドでRDDをソートする必要があります。たとえば、ここの例では、最初にfieldAで要素をソートし、その中でfieldB(セカンダリソート)でソートします。与えられた例で使用されているメソッドは十分に良いですか?私は自分のコードをテストし、それは動作します。しかし、これは信頼できる方法ですか?Sparkの結合を使用したセカンダリソート?

// x is of type (key, fieldA) and y of type (key, fieldB) 
val a = x.sortBy(_._2) 
// b will be of type (key, (fieldB, fieldA)) 
val b = y.join(x).sortBy(_._2._1)) 

したがって、次のような出力が必要です。

fieldA, fieldB 
2, 10 
2, 11 
2, 13 
7, 5 
7, 7 
7, 8 
9, 3 
9, 10 
9, 10 

答えて

2

これは信頼性の高い方法ですか?

信頼できません。それは、シャッフル中にデータがパーティションの順序で定義された順序で処理されるという仮定に依存します。これは起こるかもしれませんが、保証はありません。

つまり、シャッフルベースのソートは安定していません。一般に、フルシャッフルを2回実行することなく所望の結果を達成するために使用できる方法が存在するが、これらはかなり低いレベルであり、最適な性能のためにカスタムPartitionerが必要である。

2

あなたは

y.join(x).sortBy(r => (r._2._2, r._2._1)) 

二つのソートが一度に発生します、次のようにsortByを使用することができます。

+0

しかし、これについては、(A、B)のタイプをソートする方法の順序変数を定義する必要があると思います。いいえ?他の方法があるかもしれませんが、私の質問は、私が使用しているアプローチに関連しています。 – pythonic

関連する問題