nebula-spark-connector2.0版本使用loadEdgesToGraphx方法结果不正确

  • nebula 版本:2.0
  • nebula-spark-connector版本:2.0.0
  • java版本:1.8
  • 部署方式:分布式
  • 是否为线上版本:Y

问题描述如下:
我使用java和spark进行混合开发,调用nebula-spark-connector使用java方法,调用graphx使用scala
我在使用nebula-spark-connector进行数据加载到graphx中进行计算。
在loadEdgesToGraphx方法中看到如下问题:
图空间截图说明:
vid type为int64

在loadEdgesToGraphx方法中
从以下代码中得知,row的0和1是来源节点和目标节点

 val srcId = row.get(0).toString.getBytes()
 val dstId = row.get(1).toString.getBytes()

打印row.schema.fields(0)的类型,即为来源节点的类型,由上图可知,为INT64

但是我在执行过程中,从spark的executor中看到打印的内容为:StringType
导致了在数据库中的id再次被hash了一遍,计算结果无法原图数据库中找到。

image


以上内容为整体过程,不知道是我使用方法错误,还是真有此问题,望予以解答,谢谢。

感谢反馈, 目前从Nebula读取出来的DataFrame中 id信息默认是StringType类型的,我们fix一下基于Nebula 的vid_type定义下id的DataType。

在当前版本下你可以用loadEdgesToDF,然后自己构造成Graph。

请问下 如果是StringType,那么被哈希过的点经过graphx计算后如何和原数据点id对应呢,我没看见有这样的映射,这部分是需要自己做吗

还有就是 val edgeProp = (row.get(2).toString.toLong, props.toList) 这里,为什么row.get(2).toString 默认是可以转为longid的呢 , row.get(0) 和row.get(1) 还有判断是否为Long

是的,如果要映射回去的话是需要自己维护映射信息的。

因为第三列元素是nebula的rank,rank是long类型的。
而第一列和第二列是源点及目标点id,是支持string类型和int类型的。

好的 感谢作者

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。