Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:对象的范围_Scala_Object_Scope_Apache Spark - Fatal编程技术网

Scala:对象的范围

Scala:对象的范围,scala,object,scope,apache-spark,Scala,Object,Scope,Apache Spark,我正在运行一个用Scala 2.9.3编写的spark应用程序。下面是创建节点树的函数network。每个节点都有一组唯一的邻居,这些邻居是该特定节点的子节点。我面临的问题是对象current在for循环中是不同的对象(通过其不同的地址可以明显看出)。如何防止这种情况发生,并在我在外部声明的同一个对象上执行for循环 def network (root: Node) : Tree = { var tree = new Tree(root) var

我正在运行一个用Scala 2.9.3编写的spark应用程序。下面是创建节点树的函数
network
。每个节点都有一组唯一的邻居,这些邻居是该特定节点的子节点。我面临的问题是对象
current
for
循环中是不同的对象(通过其不同的地址可以明显看出)。如何防止这种情况发生,并在我在外部声明的同一个对象上执行
for
循环

    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
    }
其他信息:
findNeighbor
返回包含节点
userID
的邻居元组的RDD。
tree.search
函数检查树以查找树中是否已存在
n
。只有当节点不在树中时,才会将其作为子节点添加。
所有函数都正常工作。

我认为您的代码可能存在多个问题。您是否正在重新分配当前的某个位置?那么也许它应该是一个
val
?另外,为什么假设
节点的
toString
实现打印对象的“地址”?它只是在打印它的hashCode吗?在这种情况下,它的
hashCode
可能由于其内部字段的更改而更改。另外,您可能需要查看此页面:

底层Spark框架似乎在以某种方式操纵对象。它必须在我访问for循环中的RDD
neigh
时执行。将RDD转换为list(因为对象的数量很少)解决了这个问题。

我认为这是Scala内部实现的各种优化的功能,以支持JVM上的惰性评估等。此外,这可能是一个很好的学习练习,但我认为创建此树违背了Spark在RDD抽象中进行优化的目的。
[vijaygkd@is-joshbloom-hadoop 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: Node@76ab909a
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: Node@4f9e2851
>>>>>>>>>>>>>>>>>> Current2: Node@4f9e2851
>>>>>>>>>>>>>>>>>> Current2: Node@4f9e2851
>>>>>>>>>>>>>>>>>> Current2: Node@4f9e2851
>>>>>>>>>>>>>>>>>> Current3: Node@76ab909a
[success] Total time: 11 s, completed Oct 13, 2013 2:23:51 PM