2014-10-28 75 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 

它更短,更乾淨,並做工作的地圖工作。

相關問題