2014-11-12 12 views
1

Я новичок в Spark и Scala и для такого рода программирования в целом.Картирование в Spark Scala

То, что я хочу сделать следующий:

У меня есть РДД что org.apache.spark.rdd.RDD ** [(Double, Iterable [String])] **

Таким образом, возможное содержание может быть:

<1 , (A,B,C)> 
<42, (A) > 
<0 , (C,D) > 

мне нужно, чтобы превратить это в новый РД таким образом, так что я получаю такой же вывод:

<1, A> 
<1, B> 
<1, C> 
<42, A> 
<0, C> 
<0, D> 

Это должно быть очень просто, но я пробовал так много разных способов и не мог понять это правильно.

ответ

2

Вы можете использовать flatMapValues:

import org.apache.spark.SparkContext._ 

val r : RDD[(Double, Iterable[String])] = ... 
r.flatMapValues(x => x) 
+1

Я получил сообщение об ошибке: "отсутствует тип параметра для расширенной функции" Однако, просто заменив (_) с (х => х) сделал работу! так: val A = B.flatMapValues ​​(x => x) –

+0

О, возможно, в вашем случае вывод типа Scala не может работать. – zsxwing

+1

@zsxwing Это не проблема вывода типа - 'x => x' все еще требует вывода типа для работы. Просто «_» в этом конкретном контексте не означает функцию идентификации. – lmm

0

Позволяет иметь вход как

(Name , List[Interest]),

"Chandru",("Java","Scala","Python") 
"Sriram", ("Science","Maths","Hadoop","C2","c3") 
"Jai",("Flink","Scala","Haskell") 

Create a case class for the person,

case class Person(name:String, interest:List[String]) 

Create input

val input={Seq(Person("Chandru",List("Java","Scala","Python")),Person("Sriram",List("Science","Maths","Hadoop","C2","c3")),Person("Jai",List("Flink","Scala","Haskell")))} 

val rdd=sc.parallelize(input) 

val mv=rdd.map(p=>(p.name,p.interest)) 

val fmv=mv.flatMapValues(v=>v.toStream) 

fmv.collect 

Результат:

Array[(String, String)] = Array(
    (Chandru,Java), 
    (Chandru,Scala), 
    (Chandru,Python), 
    (Sriram,Science), 
    (Sriram,Maths), 
    (Sriram,Hadoop), 
    (Sriram,C2), 
    (Sriram,c3), 
    (Jai,Flink), 
    (Jai,Scala), 
    (Jai,Haskell)) 
Смежные вопросы