参加したいRDDが2つあり、次のようになります。
val rdd1:RDD[(T,U)]
val rdd2:RDD[((T,W), V)]
のキー値rdd1
が一意であり、 のタプルキー値も一意である場合がありrdd2
ます。次のrddが得られるように、2つのデータセットを結合したいと思います:
val rdd_joined:RDD[((T,W), (U,V))]
これを達成するための最も効率的な方法は何ですか? ここに私が考えたいくつかのアイデアがあります。
オプション1:
val m = rdd1.collectAsMap
val rdd_joined = rdd2.map({case ((t,w), u) => ((t,w), u, m.get(t))})
オプション 2:
val distinct_w = rdd2.map({case ((t,w), u) => w}).distinct
val rdd_joined = rdd1.cartesian(distinct_w).join(rdd2)
オプション 1 では、マスタリングするすべてのデータが収集されますよね? そのため、rdd1 が大きい場合、これは適切なオプションとは思えません (私の場合は比較的大きいですが、rdd2 よりも 1 桁小さくなっています)。オプション 2 は醜く明確なデカルト積を行いますが、これも非常に非効率的です。私の頭をよぎった (まだ試していない) 別の可能性は、オプション 1 を実行してマップをブロードキャストすることですが、マップのキーがのキーrdd2
。
誰もこのような状況に遭遇したことがありますか? お考えいただければ幸いです。
ありがとう!