spark connector写入边必须要带rankField吗?

提问参考模版:

  • nebula 版本:v3.6.0
  • 部署方式:云端
  • 安装方式:RPM
  • 是否上生产环境:N

问题:
使用pyspark通过spark connector写入edeg时,一定要带rankField吗?
目前代码:

df.write.format("com.vesoft.nebula.connector.NebulaDataSource")\
    .option("srcPolicy", "hash")\
    .option("dstPolicy", "hash")\
    .option("metaAddress", "metaip:9559")\
    .option("graphAddress", "graphip:9669")\
    .option("user", "root")\
    .option("passwd", "passwd")\
    .option("type", "edge")\
    .option("spaceName", "config_server")\
    .option("label", "request")\
    .option("srcVertexField", "src_ip")\
    .option("dstVertexField", "app_id")\
    .option("batch", 100)\
    .option("writeMode", "insert")\
    .option("randkField", "")\
    .option("operateType","write").save()

发现加上 .option(“randkField”, “”)\或者删掉randField都会报空指针错误,正确方式应该是怎样?
报错日志:

: java.lang.NullPointerException
	at com.vesoft.nebula.connector.NebulaDataSource.createWriter(NebulaDataSource.scala:96)
	at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:275)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
	at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
	at py4j.Gateway.invoke(Gateway.java:282)
	at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
	at py4j.commands.CallCommand.execute(CallCommand.java:79)
	at py4j.GatewayConnection.run(GatewayConnection.java:238)
	at java.lang.Thread.run(Thread.java:748)

定位到代码:

    } else {
      val srcVertexFiled = nebulaOptions.srcVertexField
      val dstVertexField = nebulaOptions.dstVertexField
      val rankExist      = !nebulaOptions.rankField.isEmpty
      val edgeFieldsIndex = {
        var srcIndex: Int  = -1
        var dstIndex: Int  = -1

发现应该是!nebulaOptions.rankField.isEmpty

啊,你应该是碰到了一些之前我们没验证的版本组合的行为变化,之前这里添 “” 是验证过的。你试试添 None

能不能判定 empty 呢?

目前加了rankField,稍等测试下

如果有什么测试反馈,可以来更新下帖子哈。

.option("randkField", None)
.option("randkField", “”)

好像都不行

我用时间戳表示rank,是可行的
但应该也有没有rank的情况,请问该怎么写

等我过一阵子趟一下哈,对了,版本能对应上么?原来我在spark 2.4 上 “” 是行的。

spark2.4.7
Scala2.11.12

.option(rankFiled:“”)可行
但是不带rankfiled就会报空指针错误

OK,spark2.7.x 上只需要 “” 这里就可以过了对吧?
spark 3.x 上这里无论如何都不行?如果是的话,应该是一个 bug 麻烦有时间提一个 issue?
@nicole

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