2014-11-13 4 views
17

Sagen wir, ich habe die folgenden zwei RDDs, mit den folgenden Schlüsselpaaren Werte.Welche Funktion in Spark verwendet wird, um zwei RDDs durch Tasten zu kombinieren

rdd1 = [ (key1, [value1, value2]), (key2, [value3, value4]) ] 

und

rdd2 = [ (key1, [value5, value6]), (key2, [value7]) ] 

Jetzt will ich sie von Schlüsselwerten verbinden, so zum Beispiel ich folgende

ret = [ (key1, [value1, value2, value5, value6]), (key2, [value3, value4, value7]) ] 

zurückkehren wollen, wie ich kann ich dies tun, in Funken mit Python oder Scala? Eine Möglichkeit ist die Verwendung von Join, aber Join würde ein Tupel innerhalb des Tupels erzeugen. Aber ich möchte nur ein Tupel pro Schlüsselwertpaar haben.

Antwort

7

Ich würde die beiden RDDs und zu einem reduceByKey die Werte zusammenführen.

(rdd1 union rdd2).reduceByKey(_ ++ _) 
+0

Funktioniert nicht. Gewerkschaft ist nicht bekannt. – nottinhill

+0

@SirBenBenji Er meinte wahrscheinlich rdd1.union (rdd2)? – Sai

+0

@Sai Das Gleiche, oder? Nicht sicher ist mit "nicht gefunden" gemeint. – maasg

7

Verwenden Sie einfach join und dann map die resultierende RDD.

rdd1.join(rdd2).map(case (k, (ls, rs)) => (k, ls ++ rs)) 
+0

Ich habe eine rdd von Summen und rdd von zählt. Wie würde ich ihnen mit denselben Schlüsseln beitreten, um einen Durchschnitt zu erstellen? Offen für die Möglichkeit, dass ich es falsch mache. –

+1

Dies sollte eine separate Frage sein, aber: Wenn Sie 'Werte haben: RDD [(K, Float)]' und 'counts: RDD [(K, Int)]' (ordnen Sie sie in diese Form, wenn sie nicht sind) dann kannst du 'values.join (counts)' machen, um eine 'RDD [(K, (Float, Int))]]', 'map' weg vom' K' zu bekommen, und dann kannst du den Durchschnitt machen - es gibt wahrscheinlich einen Funktioniert bereits dafür, aber der harte Weg ist 'reduzieren {case ((v1, count1), (v2, count2)) => ((v1 * count1 + v2 * count2)/(count1 + count2), (count1 + count2)}} vorausgesetzt, meine Mathematik ist richtig. – lmm

+0

Ja, das war die Lösung. Vielen Dank! –