Spark: Was ist die beste Strategie, um eine 2-Tupel-Key-RDD mit einer Single-Key-RDD zu verbinden?

Ich habe zwei RDDs, denen ich beitreten möchte, und sie sehen folgendermaßen aus:

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

Es ist der Fall, dass die Schlüsselwerte vonrdd1 sind einzigartig und auch die Tupel-Key-Werte vonrdd2 sind einzigartig. Ich möchte die beiden Datensätze verbinden, damit ich die folgende rdd erhalte:

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

Was ist der effizienteste Weg, um dies zu erreichen? Hier sind ein paar Ideen, an die ich gedacht habe.

Option 1:

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

Option 2:

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

Option 1 sammelt alle zu meisternden Daten, oder? Das scheint also keine gute Option zu sein, wenn rdd1 groß ist (es ist in meinem Fall relativ groß, obwohl eine Größenordnung kleiner als rdd2). Option 2 ist ein hässliches und kartesisches Produkt, das ebenfalls sehr ineffizient zu sein scheint. Eine andere Möglichkeit, die mir in den Sinn gekommen ist (die ich aber noch nicht ausprobiert habe), besteht darin, Option 1 auszuführen und die Karte zu übertragen. Es ist jedoch besser, die Übertragung auf "intelligente" Weise durchzuführen, damit die Tasten der Karte mit den Tasten übereinstimmen Schlüssel vonrdd2.

Hat jemand eine solche Situation schon einmal erlebt? Ich würde mich freuen, Ihre Gedanken zu haben.

Vielen Dank!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage