以下是该问题的简化代码:
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处理成员变量并在处理后保留结果?
非常感谢!
答案 0 :(得分:0)
我找到了原因:实际运行“itemsFile.foreach(addItem(_))”是在执行程序上,如果要打印出结果,应该将collect()发送回驱动程序。