2017-10-06 10 views
0

キーに基づいて2つのペアRDDsの値を比較する方法はありますか。たとえば
スカラーのキーに基づくRDDの2つのペアの値を比較する

RDD1: RDD[(Int, String)] = {(1, "ABC"), (2, "XYZ"), (3, "PQR")} 
RDD2: RDD[(Int, String)] = {(5, "AAA"), (2, "XYZ"), (3, "LMN")} 

私の仕事は、値が異なるの両方rddsに存在するキーの数を取得することです。
参加するとは23のキーになります。 しかし、私は最終的な出力を3としたいので、値は異なるです。

私は、以下のアプローチを試してみた:

var diff = rdd1.join(rdd2).map{case(k,(s1,s2))=> if (s1!=s2) (k,s1)} 

だから私は、差分の数を取得することができます。しかし、それは23の両方のキーを与えます。私は一致する値をスキップするために条件が必要だと思う。
誰でも希望の結果をどのように達成できるかをお勧めしますか? (または任意の異なるアプローチを使用して)。

答えて

2

collectを使用します。これは、部分関数を取り、その部分関数が定義されていない値を削除します。その後、含ま「もし」ではなくケースの結果式の一部のcase文でガード、など:になるだろう

val diff = rdd1.join(rdd2).collect { 
    case (k, (s1, s2)) if s1 != s2 => (k, s1) 
} 

この方法では、一部の機能がどこs1 == s2定義されることはありません、 collectそれらをフィルタリングしてください。

同等(若干少ないエレガント)溶液mapfilter使用する - 単独mapを常に入力数分のレコードを返すことになる:最初のRDDにキー本に

val diff = rdd1.join(rdd2).filter { 
    case (k, (s1, s2)) => s1 != s2 
}.map { 
    case (k, (s1, s2)) => (k, s1) 
} 
-1

使用leftInnerJoinおよびそれに数えてください。

val diff = rdd1.leftOuterJoin(rdd2).count() 
関連する問題