2014-10-28 103 views
-1

我创建了一个可变集合并使用'foreach'遍历列表来遍历集合。当我在foreach中打印集合时,它会正确打印集合的内容。但是,在'foreach'结束后,该集合是空的。我无法弄清楚我缺少的东西。Scala:添加元素以在'foreach'内部设置不会持续

import org.apache.spark._ 
import org.apache.spark.graphx._ 
import org.apache.spark.SparkConf 
import org.apache.spark.rdd.RDD 

object SparkTest { 
    def main(args: Array[String]) { 

    val conf = new SparkConf().setAppName("Spark Test") 
    val sc = new SparkContext(conf) 

    val graph = GraphLoader.edgeListFile(sc, "followers.txt") 
    val edgeList = graph.edges 

    var mapperResults = iterateMapper(edgeList) 

    sc.stop() 
    } 

    def iterateMapper(edges: EdgeRDD[Int, Int]) : scala.collection.mutable.Set[(VertexId, VertexId)] = { 
    var mapperResults = scala.collection.mutable.Set[(VertexId, VertexId)]() 
    val mappedValues = edges.mapValues(edge => (edge.srcId, edge.dstId)) ++ edges.mapValues(edge => (edge.dstId, edge.srcId)) 
    mappedValues.foreach { 
     edge => { 
     var src = edge.attr._1 
     var dst = edge.attr._2 
     mapperResults += ((src, dst)) 
     } 
    } 
    println(mapperResults) 
    return mapperResults 
    } 
} 

这是我正在使用的代码。这是Spark的一个修改示例。

println(mapperResults) 

打印出一个空集。

+0

向我们显示代码。 – 2014-10-28 18:12:00

+0

添加了代码。 – Vijay 2014-10-28 18:23:14

+1

当我在REPL中尝试时,工作得很好。 – vptheron 2014-10-28 18:25:24

回答

1

其实它工作,但在工人。
foreach是一个存在副作用的函数,但它对工作人员有用,所以你不会看到更新的Set。
其他问题是它设计为不可变!所以不要在那里使用可变集合。也没有必要这样做。下面的代码应该做你想做的事情:

var mapperResults = mappedValues.map(_.attr).distinct.collect 

它更短,更干净,并做工作的地图工作。