Apache spark 使用Spark RDD处理对象时未保存处理结果';s成员变量,

Apache spark 使用Spark RDD处理对象时未保存处理结果';s成员变量,,apache-spark,Apache Spark,以下是该问题的简化代码: class TestClass extends Serializable { val map=Map[String,String](); private def addItem(s:String){ val sArr=s.split(","); map(sArr(0))=sArr(1); println("***TEST item added: "+sArr(0)+"->"+sArr(1)); println("***TEST map si

以下是该问题的简化代码:

class TestClass extends Serializable {
  val map=Map[String,String]();
  private def addItem(s:String){
  val sArr=s.split(",");
  map(sArr(0))=sArr(1);
  println("***TEST item added: "+sArr(0)+"->"+sArr(1));
  println("***TEST map size: "+map.size);
}
def test(){
  val itemsFile = spark.sparkContext.textFile("./items.txt");
  val itemsFile = spark.sparkContext.textFile("./items.txt");
  itemsFile.foreach( addItem(_) );
  //problem:the output is 0 of the line below!
 println("***TEST map size is "+map.size);
}
}
addItem()是将(K,v)添加到对象的成员变量“map”中。test()是将文件中的行(每行是(K,v)对)读取到RDD中,然后处理每行以将相应的(K,v)添加到“map”中。

调用test()时,我们可以看到addItem()一直被成功调用,并且“map”的大小在增加。但在执行最后一个“print()”时,map变为空,因此大小为0

实际上,类实例(对象)的成员变量“map”与我们传递给“itemsFile.foreach()”的不一样。但是为什么?(我是Spark的新手。)我们如何使用Spark RDD处理成员变量并在处理后保留结果


非常感谢!

我找到了原因:实际运行的“itemsFile.foreach(addItem())”在执行器上,如果要打印结果,应该使用collect()将其发送回驱动程序。

请单击“在此处输入图像描述”查看运行结果。(这是我第一次在Stackoverflow上发布问题,所以不熟悉如何编辑…谢谢!