Scala:在'foreach'中添加要设置的元素不会持续存在

时间:2014-10-28 18:10:21

标签: scala

我创建了一个可变集,并使用' foreach'迭代列表。填充集。当我在foreach中打印设置时,它会正确打印设置的内容。但是,在#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)

打印出一个空集。

1 个答案:

答案 0 :(得分:1)

实际上它有效,但在工人中 foreach是一个副作用存在的函数,但它适用于worker,因此你不会看到更新的Set。
其他问题是它设计为Immutable!所以不要在那里使用可变集合。也没有必要。以下代码应该做你想做的事情:

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

它更短,更干净,并且可以对工人进行地图工作。