将带有列列的RDD转换为Spark中的多行

时间:2016-10-24 23:55:09

标签: scala apache-spark rdd

您好我有一个RDD表(带案例类userInfo(userID:Long,day:String,prodIDList:String))

离)

userA,2016-10-12,[10000,100001]

userB,2016-10-13,[9999,1003]

userC,2016-10-13,[8888,1003,2000]

我想把它变成像,

ex)

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,但我不知道如何将它应用于我的情况,因为我是火花初学者。

提前致谢。

2 个答案:

答案 0 :(得分:2)

如果您对数据帧API没问题,可以将RDD转换为数据帧并使用" explode"功能。它将如下所示。

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

答案 1 :(得分:0)

试试这个:

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)}