我有一个 (key, value) 的 RDD,我将其转换为 (key, List(value1, value2, value3) 的 RDD,如下所示。
val rddInit = sc.parallelize(List((1, 2), (1, 3), (2, 5), (2, 7), (3, 10)))
val rddReduced = rddInit..groupByKey.mapValues(_.toList)
rddReduced.take(3).foreach(println)
这段代码给了我下一个 RDD :
(1,列表(2, 3)) (2,列表(5, 7)) (3,列表(10))
但现在我想从我刚刚计算的 rdd(rddReduced rdd)返回到 rddInit。
我的第一个猜测是实现键和列表中每个元素之间的某种叉积,如下所示:
rddReduced.map{
case (x, y) =>
val myList:ListBuffer[(Int, Int)] = ListBuffer()
for(element <- y) {
myList+=new Pair(x, element)
}
myList.toList
}.flatMap(x => x).take(5).foreach(println)
通过这段代码,我得到了初始 RDD 结果。但我不认为在 Spark 作业中使用 ListBuffer 是一个好的做法。还有其他方法可以解决这个问题吗?