我的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)
有没有其他方法可以解决这个问题?
答案 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)