2014-11-13 8 views
17

Powiedzmy, że mam następujące dwa RDD z następującymi wartościami para kluczy.Która funkcja iskry jest używana do łączenia dwóch RDD za pomocą klawiszy

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

i

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

Teraz chcę połączyć je przez kluczowe wartości, tak na przykład chcę zwrócić następujący

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

Jak mogę to zrobić, w iskra za pomocą Python lub Scala? Jednym ze sposobów jest użycie join, ale join tworzy krotkę wewnątrz krotki. Ale chcę mieć tylko jedną krotkę na parę kluczy.

Odpowiedz

7

Chciałbym połączyć dwa RDD i zmniejszyćByKey, aby połączyć wartości.

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

Nie działa. "union" nie jest znane. – nottinhill

+0

@SirBenBenji Prawdopodobnie miał na myśli rdd1.union (rdd2)? – Sai

+0

@ Sai To samo, prawda? Nie jestem pewien, czy chodzi o "nieodnalezioną" – maasg

7

Po prostu użyj join, a następnie map wynikowego rdd.

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

Mam rdd sum i rdd zliczeń. Jak dołączyłem do nich tymi samymi kluczami, aby stworzyć średnią. Otwarty na możliwość, że robię to źle. –

+1

To powinno być osobne pytanie, ale: jeśli posiadasz 'wartości: RDD [(K, Float)]' i 'counts: RDD [(K, Int)]' (zamapuj je na ten kształt, jeśli nie są) wtedy możesz zrobić 'values.join (counts)', aby uzyskać 'RDD [(K, (Float, Int))],' odwróć 'K', a następnie możesz zrobić średnią - prawdopodobnie jest do tego już działa, ale trudniejszą metodą jest 'reduce {case ((v1, count1), (v2, count2)) => ((v1 * count1 + v2 * count2)/(count1 + count2), (count1 + count2))} "zakładając, że moja matematyka ma rację. – lmm

+0

Tak, to było rozwiązanie. Dzięki! –

Powiązane problemy