使用Spark RDD处理对象的成员变量

时间:2017-03-13 03:05:30

标签: 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 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"。 enter image description here

当调用test()时,我们可以看到addItem()一直被成功调用,并且" map"的大小正在增加。但是当执行最后一次" print()"时,地图变空,因此大小为0 ......

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

非常感谢!

1 个答案:

答案 0 :(得分:0)

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