2013-10-13 124 views
0

我正在运行用Scala 2.9.3编写的Spark应用程序。以下是创建节点树的功能network。每个节点都有一组唯一的邻居,它们是该特定节点的子节点。我面临的问题是在for循环内对象current是不同的对象(通过其不同的地址显而易见)。我怎样才能防止这种情况,并且在外部宣布的同一个对象上执行for循环?Scala:对象范围

def network (root: Node) : Tree = 
    { 
     var tree = new Tree(root) 
     var queue = ListBuffer[Node](root) 

     while (!queue.isEmpty && queue(0).level<maxlen) 
     { 
      var current: Node = queue.remove(0) 
      println(">>>>>>>>>>>>>>>>>> Current1: "+current) 
      var neigh = findNeighbor(current.userID) 
      for (n <- neigh) 
      { 
        if(tree.search(n._1) == null) 
        { 
          var c = new Node(n._1, current.level+1, n._2, n._3) 
          current.addChild(c) 
          println(">>>>>>>>>>>>>>>>>> Current2: "+current) 
        } 
      } 
      println(">>>>>>>>>>>>>>>>>> Current3: "+current) 
      queue ++= current.neighbors 
     } 
     return tree 
    } 

下面是代码的输出。在由Current1,Current2和Current3表示的3个位置检查值为current。我们观察到,当前1 == Current3

[[email protected] network]$ sbt run 
Loading /usr/local/sbt/bin/sbt-launch-lib.bash 
[info] Set current project to Network (in build file:/usr/local/spark/test/vijay/network/) 
[info] Compiling 1 Scala source to /usr/local/spark/test/vijay/network/target/scala-2.9.3/classes... 
[info] Running Network 
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
>>>>>>>>>>>>>>>>>> Current1: [email protected] 
13/10/13 14:23:50 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
13/10/13 14:23:50 WARN snappy.LoadSnappy: Snappy native library not loaded 
13/10/13 14:23:50 INFO mapred.FileInputFormat: Total input paths to process : 1 
>>>>>>>>>>>>>>>>>> Current2: [email protected] 
>>>>>>>>>>>>>>>>>> Current2: [email protected] 
>>>>>>>>>>>>>>>>>> Current2: [email protected] 
>>>>>>>>>>>>>>>>>> Current2: [email protected] 
>>>>>>>>>>>>>>>>>> Current3: [email protected] 
[success] Total time: 11 s, completed Oct 13, 2013 2:23:51 PM 

附加信息:findNeighbor返回一个包含邻居的元组节点userID一个RDD。 tree.search函数检查树,以查找n是否已存在于树中。只有在树中不存在节点时才将其作为子节点添加。 所有功能都按预期工作。

+0

我认为这是各种优化的一个功能,Scala内部支持懒惰评估等等。此外,这可能是一个很好的学习练习,但我认为创建此树会打破Spark在RDD抽象中进行优化的目的。 – Vidya

回答

0

我认为您的代码可能存在多个问题。你在某个地方重新分配current吗?那么也许它应该是val?另外,为什么你假设toString执行Node打印我们的对象的“地址”?也许只是打印其hashCode?在这种情况下,可能由于内部字段发生变化而导致hashCode发生变化。此外,您可能想要查看此页面:https://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions

0

基础Spark框架似乎在某种程度上操纵对象。当我访问for循环中的RDD neigh时必须执行此操作。将RDD转换为列表(因为对象数量很少)解决了这个问题。