以这个简单的RDD为例解释问题:
val testRDD=sc.parallelize(List((1, 2), (3, 4), (3, 6)))
我有这个功能来帮助我实现索引:
var sum = 0;
def inc(l: Int): Int = {
sum += l
sum
}
现在我想为每个元组创建id:
val indexedRDD= testRDD.map(x=>(x._1,x._2,inc(1)));
输出RDD应为((1,2,1), (3,4,2), (3,6,3))
但事实证明所有的价值都是一样的。所有元组都取1:
((1,2,1), (3,4,1), (3,6,1))
我哪里错了?有没有其他方法可以达到同样的目的。
答案 0 :(得分:3)
您正在寻找:
def zipWithIndex(): RDD[(T, Long)]
但是,请注意文档:
请注意,某些RDD(例如groupBy()返回的RDD)不会 保证分区中元素的顺序。分配给每个的索引 因此,不保证元素,如果RDD,甚至可能会改变 重新评估。如果需要固定订购以保证相同 索引分配,您应该使用sortByKey()对RDD进行排序或保存 到文件。