在spark(scala)中修改对象的RDD

Vik*_*h B 1 scala apache-spark rdd

我有:

val rdd1: RDD[myClass]
Run Code Online (Sandbox Code Playgroud)

它已经初始化,我检查时调试所有成员都有他们的默认值

如果我做

rdd1.foreach(x=>x.modifier())
Run Code Online (Sandbox Code Playgroud)

其中modifier是myClass的成员函数,它修改了一些成员变量

执行此操作后,如果我检查RDD内的值,则它们尚未被修改.

有人能解释一下这里发生了什么吗?是否可以确保在RDD内部修改值?

编辑:

class myClass(var id:String,var sessions: Buffer[Long],var avgsession: Long)  {
    def calcAvg(){
   // calculate avg by summing over sessions and dividing by legnth
   // Store this average in avgsession
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,avgsession属性不会更新

myrdd.foreach(x=>x.calcAvg())
Run Code Online (Sandbox Code Playgroud)

Sve*_*end 8

RDD是不可变的,在它包含的对象上调用变异方法不会产生任何影响.

获得所需结果的方法是生成新副本MyClass而不是修改实例:

case class MyClass(id:String, avgsession: Long) {
    def modifier(a: Int):MyClass = 
       this.copy(avgsession = this.avgsession + a) 
}
Run Code Online (Sandbox Code Playgroud)

现在你仍然无法更新rdd1,但是你可以获得包含更新实例的rdd2:

rdd2 = rdd1.map (_.modifier(18) ) 
Run Code Online (Sandbox Code Playgroud)