使用共享可变状态向RDD添加索引

时间:2015-12-31 07:26:13

标签: scala apache-spark rdd

以这个简单的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))

我哪里错了?有没有其他方法可以达到同样的目的。

1 个答案:

答案 0 :(得分:3)

您正在寻找:

def zipWithIndex(): RDD[(T, Long)]

但是,请注意文档:

  

请注意,某些RDD(例如groupBy()返回的RDD)不会   保证分区中元素的顺序。分配给每个的索引   因此,不保证元素,如果RDD,甚至可能会改变   重新评估。如果需要固定订购以保证相同   索引分配,您应该使用sortByKey()对RDD进行排序或保存   到文件。