在org.apache.spark.graphx.Edge初始化中获取null属性

时间:2016-04-27 08:31:55

标签: apache-spark spark-graphx

我正在使用带scala的spark,而我正在做的是解析包含wikidata项的JSON文件,将其与一些额外信息相结合并创建一个新的JSON文件。在这样做的过程中,我创建了一组WikidataItem项,其中每个项包含一组与其他Wikidata项的边。边是org.apache.spark.graphx.Edge的实例。此类包含树(var)属性srdId, dstId, attr

我的问题如下:每当我使用Edge调用new Edge(srcID=1,dstId=2,attr=3)的构造函数时,attr字段实际上为null。而是创建了attr$mcl$sp形式的新字段,其中包含attr的值。通常可以通过调用Edge.attr来访问该值,但在我序列化WikidataItems时,边缘在JSON文件中包含4个字段,即srcId, dstId, attr, attr$mcl$sp,其中attr=null。知道为什么会发生这种情况以及它是如何面对的?

在研究这种现象时,我创建了一个简单的测试,我只需创建一个新的Edge,然后通过调试器运行它。在这个简单的情况下,问题仍然存在。

生成问题的代码如下所示。虽然我强调问题在于,在创建Edge时内部,属性attr的值仍为空。只需运行下面的foo方法并使用调试器即可轻松看到这一点。

import org.apache.spark.graphx.Edge
import java.io.StringWriter
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule


def toJson(obj: Any): String = {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)

val out = new StringWriter
mapper.writeValue(out, obj)
return out.toString()
}

def foo()={
 val edge=new Edge(1,2,3)
 println(toJson(edge))
}

1 个答案:

答案 0 :(得分:1)

显然,只有Scala的原始数字类型才会发生这种情况。作为一种解决方法,您可以尝试使用java的Integer,它与Scala非常兼容:

scala> val edge = Edge[java.lang.Integer](1, 2, 3)
scala> println(toJson(edge))
{"srcId":1,"dstId":2,"attr":3}