Apache spark 更新RDD元素的内部状态
我是Spark的新手,我想用Apache spark 更新RDD元素的内部状态,apache-spark,rdd,Apache Spark,Rdd,我是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 t
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
RDD在设计上是不变的。这种设计选择使它们更加健壮,因为变异是常见的错误源,并且它支持RDD名称(弹性分布式数据集)的“弹性”部分;如果下游RDD中的分区丢失,Spark可以从其父分区重建它。因此,最好将Spark编程视为数据流的构造,即使您不进行流式处理
在foreach上,它是为“纯副作用”操作而设计的,如写入磁盘、数据库或控制台。RDD是设计不变的。这种设计选择使它们更加健壮,因为变异是常见的错误源,并且它支持RDD名称(弹性分布式数据集)的“弹性”部分;如果下游RDD中的分区丢失,Spark可以从其父分区重建它。因此,最好将Spark编程视为数据流的构造,即使您不进行流式处理 在foreach上,它是为“纯副作用”操作而设计的,如写入磁盘、数据库或控制台