如何将增加的id添加到reduceByKey的结果并使用mapValues排序

时间:2017-11-10 09:14:18

标签: scala apache-spark

我的RDD为(键,值),例如“:

val rddInit = sc.parallelize(List((1, 2), (1, 3), (2, 5), (2, 7),(2,1), (3, 10)))
val rddData = rddInit..groupByKey.mapValues(row=>{row.toList.sortWith(_>_)})
val rddRestored = rddData.flatMap{
  case (k, v) => v.map((k, _))
}
rddRestored.collect().foreach(println)

结果是:

(1,3)
(1,2)
(2,7)
(2,5)
(2,1)
(3,10)

我想要的结果如下:

(1,3,1)
(1,2,2)
(2,7,1)
(2,5,2)
(2,1,3)
(3,10,1)

有没有其他方法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

您只需zipWithIndex即可创建分组RDD排名zipWithIndex将从0开始,因此您需要进行一些修改才能从1开始。

以下解决方案适合您

val rddInit = sc.parallelize(List((1, 2), (1, 3), (2, 5), (2, 7),(2,1), (3, 10)))
val rddData = rddInit.groupByKey.mapValues(row=>{row.toList.sortWith(_>_)}.zipWithIndex.map{ case (r, i) => (r,i+1)})
val rddRestored = rddData.flatMap{
  case (k, v) => {
    v.map(x =>(k, x._1, x._2))
  }
}
rddRestored.collect().foreach(println)

您应该拥有以下输出

(1,3,1)
(1,2,2)
(3,10,1)
(2,7,1)
(2,5,2)
(2,1,3)