在 Spark 中映射列表的每个元素
Map each element of a list in Spark
我正在使用以这种方式构造对的 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。任何的想法?这是一种错误的做法吗?
您可以使用 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)] - 键与输入元组相同,但它为输入列表中的每个元素创建一个输出元组。 flatMap
导致这个 List 的每个元素在 RDD
中变成一行
我正在使用以这种方式构造对的 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。任何的想法?这是一种错误的做法吗?
您可以使用 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)] - 键与输入元组相同,但它为输入列表中的每个元素创建一个输出元组。 flatMap
导致这个 List 的每个元素在 RDD