我正在使用带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))
}
答案 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}