【问题标题】:Map each element of a list in Spark在 Spark 中映射列表的每个元素
【发布时间】:2017-03-17 21:34:56
【问题描述】:

我正在使用这样一个结构对的 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 找到。任何的想法?这是错误的方法吗?

【问题讨论】:

    标签: apache-spark mapreduce rdd spark-graphx


    【解决方案1】:

    你可以使用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 中的一行

    【讨论】:

    • 谢谢,我愚蠢地认为在地图(或平面地图)中制作地图是错误的。我是初学者。非常感谢。
    • @Matt Inner map 不是 Spark 的转换——它是标准的 Scala List 操作 :) 所以你可以在 flatMap 中使用它。您不能只使用其他 Spark 操作和转换,即在 RDD、DataFrame 或 Dataset 上映射
    猜你喜欢
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多