2016-05-05 2 views
1

У меня 2 спаренных РД, как показано нижеРДД поиска внутри трансформации

RDD1 содержит имя в качестве ключа и почтового индекса в качестве значения:

RDD1 -> РДД ((Ashley, 20171), (йаш, 33613), (Evan, 40217))

RDD2 содержит почтовый индекс в качестве ключа и некоторое случайное число в качестве значения:

RDD2 -> РДД ((20171 , 235523), (33613, 345345345), (40189, 44355217), (40122, 2345235), (40127, 232323424))

мне нужно заменить Почтовые индексы в RDD1 с соответствующими значениями из RDD2. Таким образом, результат будет

RDD3 -> РДД ((Ashley, 235523), (Яш, 345345345), (Evan, 232323424))

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

val rdd3 = rdd1.map(x => (x._1, rdd2.lookup(x._2)(0))) 
+2

Вы не можете сделать это. Если 'rdd2' мал, вы можете собрать его на драйвере и транслировать его, тогда то, что вы пытаетесь, будет возможно. В противном случае вам, вероятно, придется играть с объединениями, чтобы достичь того, чего вы хотите. – vanza

+0

Вы имеете в виду что-то вроде этого? val zipmap = Карта («40217» -> «Алабама», «40222» -> «Аляска», «20127» -> «майами», «33613» -> «Херндон», «40111» -> «тампа») val broadcastVar = sc.broadcast (zipmap) val user_zip_lookup = user_zip_pair.map (x => (x._1, broadcastVar.value (x._2))) – yAsH

+0

Да, это его суть, если вы можете транслировать данные , – vanza

ответ

6

Йон может просто присоединиться к 2 РДУ по почтовому индексу:

rdd1.map({case (name, zipcode) => (zipcode, name)}) 
    .join(rdd2) 
    .map({case (zipcode, (name, number)) => (name, number)}) 
    .collect() 

Обратите внимание, что это возвратит только записи, имеющие соответствующие zip-коды в rdd1 и rdd2. Если вы хотите установить некоторое количество по умолчанию для записей в rdd1, который не имеет соответствующего почтовый индекс в rdd2, используйте leftOuterJoin InstEd из присоединиться:

rdd1.map({case (name, zipcode) => (zipcode, name)}) 
    .leftOuterJoin(rdd2) 
    .map({case (zipcode, (name, number)) => (name, number.getOrElse(0))}) 
    .collect() 
+0

@Vvitaliy Спасибо за ответ. Letz говорят, что в rdd2 есть ключ, называемый другим. Как установить значение другого для записей в rdd1, которые не совпадают? – yAsH

+0

Здесь вы только предполагаете, что значение другого равно 0. Что делать, если мы не знаем значение другого и выбираем его из rdd2? – yAsH

+0

с 'leftOuterJoin' он выбирает значение' number' из rdd2, если существует запись в rdd2, которая удовлетворяет условию 'rdd1.zipcode == rdd2.zipcode', если нет, то оно устанавливает значение 0. если можно установить его на любое значение вы хотите, но если вы хотите выбрать его по некоторой логике из rdd2, вам нужно выполнить более сложное соединение, в зависимости от этой логики. –

Смежные вопросы