2017-03-17 102 views
0

我正在用这种方式构建对的RDD:[Int,List [Int]]我的目标是映射每个键对的列表项。因此,例如我需要这样做:在Spark中映射列表中的每个元素

RDD1:[Int, List[Int]] 
<1><[2, 3]> 
<2><[3, 5, 8]> 

RDD2:[Int, Int] 
<1><2> 
<1><3> 
<2><3> 
<2><5> 
<2><8> 

以及我不明白为了达到RDD2需要什么样的转换。转换列表可以在here找到。任何想法?这是一个错误的方法?

回答

2

您可以使用flatMap

val rdd1 = sc.parallelize(Seq((1, List(2, 3)), (2, List(3, 5, 8)))) 
val rdd2 = rdd1.flatMap(x => x._2.map(y => (x._1, y))) 

// or: 
val rdd2 = rdd1.flatMap{case (key, list) => list.map(nr => (key, nr))} 

// print result: 
rdd2.collect().foreach(println) 

给出了结果:

(1,2) 
(1,3) 
(2,3) 
(2,5) 
(2,8) 

flatMap创建几个输出对象从一个输入对象。

在你的情况中,f​​latMap中的内部映射将元组(int,List [Int])映射到List [(Int,Int)] - 键与输入元组相同,但是对于输入列表中的每个元素,输出元组。 flatMap导致此列表中的每个元素都成为RDD中的一行

+0

谢谢,我愚蠢地认为在地图(或flatMap)内部制作地图是错误的。我是初学者。非常感谢你。 – Matt

+1

@Matt内部映射不是Spark的转换 - 它是标准的Scala List操作:)所以你可以在flatMap中使用它。您不能仅使用其他Spark操作和转换,即RDD,DataFrame或Dataset上的映射 –

相关问题