Spark: jaka jest najlepsza strategia dołączania do RDD z 2 kluczami z pojedynczym kluczem RDD?

Mam dwa RDD, które chcę dołączyć i wyglądają tak:

val rdd1:RDD[(T,U)]
val rdd2:RDD[((T,W), V)]

Tak się składa, że ​​kluczowe wartościrdd1 są unikalne, a także, że wartości klucza krotkirdd2 są wyjątkowe. Chciałbym dołączyć dwa zestawy danych, aby uzyskać następujące rdd:

val rdd_joined:RDD[((T,W), (U,V))]

Jaki jest najskuteczniejszy sposób osiągnięcia tego celu? Oto kilka pomysłów, o których pomyślałem.

Opcja 1:

val m = rdd1.collectAsMap
val rdd_joined = rdd2.map({case ((t,w), u) => ((t,w), u, m.get(t))})

Opcja 2:

val distinct_w = rdd2.map({case ((t,w), u) => w}).distinct
val rdd_joined = rdd1.cartesian(distinct_w).join(rdd2)

Opcja 1 zbierze wszystkie dane do opanowania, prawda? Więc nie wydaje się to dobrym rozwiązaniem, jeśli rdd1 jest duży (w moim przypadku jest stosunkowo duży, chociaż o rząd wielkości mniejszy niż rdd2). Opcja 2 ma brzydki, odrębny i kartezjański produkt, który również wydaje się bardzo nieefektywny. Inną możliwością, która przyszła mi do głowy (ale jeszcze nie próbowałem), jest wykonanie opcji 1 i nadanie mapy, chociaż lepiej byłoby nadawać w „sprytny” sposób, aby klucze mapy były zlokalizowane razem z klucze odrdd2.

Czy ktoś wcześniej spotkał się z taką sytuacją? Byłbym szczęśliwy mogąc mieć twoje myśli.

Dzięki!

questionAnswers(2)

yourAnswerToTheQuestion