在 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}
我在 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}