我是Spark的新手,我想用rdd.foreach
方法更新我的RDD元素的内部状态,但它不起作用。这是我的代码示例:
class Test extends Serializable{
var foo = 0.0
var bar = 0.0
def updateFooBar() = {
foo = Math.random()
bar = Math.random()
}
}
var testList = Array.fill(5)(new Test())
var testRDD = sc.parallelize(testList)
testRDD.foreach{ x => x.updateFooBar() }
testRDD.collect().foreach { x=> println(x.foo+"~"+x.bar) }
结果是:
0.0~0.0
0.0~0.0
0.0~0.0
0.0~0.0
0.0~0.0
答案 0 :(得分:4)
RDD在设计上是不可变的。这种设计选择使它们更加健壮,因为突变是错误的常见来源,它支持"弹性" RDD名称的一部分(弹性分布式数据集);如果下游RDD中的分区丢失,Spark可以从其父节点重建它。因此,最好将Spark编程视为数据流的构建,即使您没有进行流式处理。
在foreach
上,它专为"纯粹的副作用"操作,如写入磁盘,数据库或控制台。