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)
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)