2015-07-31 3 views
2

У меня есть следующие пары ключ-значение списков (например, в HashMap, но не совсем в контексте искры):Объединение двух коллекций ключ-значение с искрой эффективно

val m1 = sc.parallelize(List(1 -> "a", 2 -> "b", 3 -> "c", 4 -> "d")) 
val m2 = sc.parallelize(List(1 -> "A", 2 -> "B", 3 -> "C", 5 -> "E")) 

Я хочу, чтобы получить что-то вроде этого и делать, если эффективно параллельно (даже не знаю, если это возможно

List(1 -> (Some("a"), Some("A")), 2 -> (Some("b"), Some("B")), 3 -> (Some("c"), Some("C")), 4 -> (Some("d"), None), 5 -> (None, Some("E"))) 

или, по крайней мере,

List(1 -> ("a","A"), 2 -> ("b","B"), 3 -> ("c","C")) 

Как достичь этого? Насколько я понимаю - у меня нет эффективного способа получить значения из «карт» по ключевому слову - на самом деле это не хэшмапы.

ответ

2

Вы можете использовать fullOuterJoin функцию:

val m1: RDD[(Int, String)] = //... 
val m2: RDD[(Int, String)] = //... 
val j: RDD[(Int, (Option[String], Option[String]))] = m1.fullOuterJoin(m2) 

В зависимости от вашего использования, вы можете использовать любой вариант объединений:

val full: RDD[(Int, (Option[String], Option[String]))] = m1.fullOuterJoin(m2) 
val left: RDD[(Int, (String, Option[String]))]   = m1.leftOuterJoin(m2)  
val right: RDD[(Int, (Option[String], String))]   = m1.rightOuterJoin(m2) 
val join: RDD[(Int, (String, String))]     = m1.join(m2) 
1

Простой join должен работать:

rdd1.join(rdd2) //RDD[K, (V1,V2)] 
1

Утвержденный ответ правильный, если вы хотите прочитать об этом, проверьте эти пары «ключ/значение» статья из Key/Value pairs

0

Или использовать союз ...

rdd1.union(rdd2).groupByKey() 
Смежные вопросы