更新 RDD 元素的内部状态

Update the internal state of RDD elements

我是 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

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

foreach 上,它专为 "pure side effect" 操作而设计,例如写入磁盘、数据库或控制台。