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

Getting null attribute in org.apache.spark.graphx.Edge initialization

我在 scala 中使用 spark,我正在做的是解析一个包含维基数据项的 JSON 文件,将它与一些额外信息结合起来并创建一个新的 JSON 文件。这样做时,我创建了一组 WikidataItem 项,其中每个项都包含一组到其他 Wikidata 项的边。边是 org.apache.spark.graphx.Edge 的实例。此 class 包含树 (var) 属性 srdId, dstId, attr.

我的问题如下:每当我使用 new Edge(srcID=1,dstId=2,attr=3) 调用 Edge 的构造函数时,attr 字段实际上为空。取而代之的是创建一个 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))
}

显然它只发生在 Scala 的原始数字类型上。作为解决方法,您可以尝试使用 java 的整数,它与 Scala 配合得很好:

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