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!