我创建了一个可变集,并使用' 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)
打印出一个空集。
答案 0 :(得分:1)
实际上它有效,但在工人中
foreach是一个副作用存在的函数,但它适用于worker,因此你不会看到更新的Set。
其他问题是它设计为Immutable!所以不要在那里使用可变集合。也没有必要。以下代码应该做你想做的事情:
var mapperResults = mappedValues.map(_.attr).distinct.collect
它更短,更干净,并且可以对工人进行地图工作。