映射Spark中列表的每个元素

时间:2017-03-17 21:34:56

标签: apache-spark mapreduce rdd spark-graphx

我正在使用RDD,这对结构是这样的:[Int,List [Int]]我的目标是用密钥映射每对列表中的项目。例如,我需要这样做:

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。任何的想法?这是一种错误的做法吗?

1 个答案:

答案 0 :(得分: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从一个输入对象创建了几个输出对象。

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