2014-11-13 9 views
17

Diciamo che ho i seguenti due RDD, con i seguenti valori di coppie di chiavi.Quale funzione nella scintilla viene usata per combinare due RDD con i tasti

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

e

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

Ora, voglio unirmi a loro per valori chiave, così per esempio che voglio restituire il seguente

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

Come posso fare questo, in scintilla usando Python o Scala? Un modo è usare join, ma join creerebbe una tupla all'interno della tupla. Ma voglio avere solo una tupla per coppia di valori chiave.

risposta

7

avrei unione dei due RDDs e ad un reduceByKey di fondere i valori.

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

Non funziona. 'union' non è noto. – nottinhill

+0

@SirBenBenji Probabilmente intendeva rdd1.union (rdd2)? – Sai

+0

@Sai Stessa cosa, giusto? Non si intende con certezza "non trovato" – maasg

7

Basta usare join e quindi map il risultante rdd.

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

Ho un rdd di totali e rdd di conteggi. Come vorrei unirmi a loro con le stesse chiavi per creare una media. Aperto alla possibilità che sto sbagliando. –

+1

Questa dovrebbe essere una domanda separata, ma: se si hanno valori ': RDD [(K, Float)]' e 'conta: RDD [(K, Int)]' (mappali in questa forma se non lo sono) quindi si può fare 'values.join (counts)' per ottenere un 'RDD [(K, (Float, Int))]', 'map' via il' K', e quindi si può fare la media - probabilmente c'è un funzione per questo già, ma il modo difficile è 'ridurre {caso ((v1, count1), (v2, count2)) => ((v1 * count1 + v2 * count2)/(count1 + count2), (count1 + count2))} presupponendo che la mia matematica sia giusta. – lmm

+0

Sì, questo è quello che alla fine è stata la soluzione. Grazie! –

Problemi correlati