【问题标题】:transform the RDD with list column , into multiple rows in Spark将带有列表列的 RDD 转换为 Spark 中的多行
【发布时间】:2016-10-24 23:55:09
【问题描述】:

您好,我有一个像 with case class userInfo(userID: Long, day: String, prodIDList: String) 这样的 RDD 表

userA, 2016-10-12, [10000, 100001]
userB, 2016-10-13, [9999, 1003]
userC, 2016-10-13, [8888, 1003,2000]

我想把它变成like,

userA, 2016-10-12, 10000
userA, 2016-10-12,100001
userB, 2016-10-13,9999
userB, 2016-10-13, 1003
userC, 2016-10-13, 8888
userC, 2016-10-13, 1003
userC, 2016-10-13, 2000

任何人都知道如何在 Spark 中使用 RDD 命令来做到这一点?

当我在Spark RDD mapping one row of data into multiple rows 中查看堆栈溢出中的相关帖子时,它建议我使用 flatmap,但我不知道如何将其应用于我的案例,因为我是 spark 初学者。

提前致谢。

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    如果您对数据框 API 没问题,您可以将 RDD 转换为数据框并使用“explode”函数。如下所示。

    > import spark.implicits._
    > val df = rdd.toDF()
    > val exploded = df.withColumn("prodID", explode(col("prodIDList")))
    

    【讨论】:

      【解决方案2】:

      试试这个:

      val data = sc.parallelize(Array(("userA", "2016-10-12", Array(10000, 100001)),
                   ("userB", "2016-10-13", Array(9999, 1003)),
                   ("userC", "2016-10-13", Array(8888, 1003,2000))))
      val resultRDD = dataRDD.map{ case (a, b, c) => ((a, b), c)
      }.flatMapValues(x => x).map{ case ((a, b), c) => (a, b, c)}
      

      【讨论】:

      • 谢谢约翰,这就是我想要的!
      • 太棒了!您可以单击检查按钮以接受此作为正确答案吗?谢谢。
      猜你喜欢
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 2018-09-27
      • 1970-01-01
      • 2020-12-06
      相关资源
      最近更新 更多