更新RDD元素的内部状态

时间:2015-04-16 15:38:35

标签: 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 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

1 个答案:

答案 0 :(得分:4)

RDD在设计上是不可变的。这种设计选择使它们更加健壮,因为突变是错误的常见来源,它支持"弹性" RDD名称的一部分(弹性分布式数据集);如果下游RDD中的分区丢失,Spark可以从其父节点重建它。因此,最好将Spark编程视为数据流的构建,即使您没有进行流式处理。

foreach上,它专为"纯粹的副作用"操作,如写入磁盘,数据库或控制台。