nebulagraph algorithm 调用Louvain算法报错

老师您好!
我在spark环境下,按照 PageRankExample.scala 的示例,尝试调用Louvain算法,结果发生报错。
整体思路是按照下面:

import com.vesoft.nebula.algorithm.config.{Configs, PRConfig, SparkConfig}
import org.apache.spark.sql.{DataFrame, SparkSession}
import com.facebook.thrift.protocol.TCompactProtocol
import com.vesoft.nebula.algorithm.config.{LPAConfig, LouvainConfig}
import com.vesoft.nebula.algorithm.lib.{LabelPropagationAlgo, LouvainAlgo}
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}

val spark = SparkSession.builder().master("local").getOrCreate()
spark.read.option("header", true).option("delimiter", ",").csv("/opt/offline/nebula/edge_follow_head.csv")

def louvain(spark: SparkSession, df: DataFrame): Unit = {
  val encodedDF      = convertStringId2LongId(df)
  val louvainConfig = LouvainConfig(10, 5, 0.5)
  val louvain       = LouvainAlgo.apply(spark, encodedDF, louvainConfig, false)
  val decodedPr      = reconvertLongId2StringId(spark, pr)
  decodedPr.show()

以下是大致截图:

  1. 读取数据
  2. 定义字符串转整型数据、整型转字符串数据
  3. 转换类型


    查看转换后的结果:
  4. 调用louvain算法(报错)


请问各位老师,这个错误是什么原因呢?调用pagerank算法好像可以跑通。

所以你的 spark 版本号多少,用的 nebula-algorithm 什么版本?

spark版本是3.2.1,nebula-algorithm是3.0.0版本,另外我是通过下面命令进入spark-shell

spark-shell --jars /opt/offline/nebula/nebula-algorithm-3.0.0.jar

spark版本不兼容,algorithm只支持spark2.4

哦哦 好的 我改下版本试试 谢谢!
另外还想多问一下,1. 如果调用louvain算法进行社区划分后,如何将结果应用回图库呢?
2. 是给每个节点加一个类似cluster_id的属性吗?(我前几天用python中的igraph和louvain模块,是这么做的)
3. 是否能将节点的社区划分可视化呢?

1和2: 是的,算法结果你需要写回图数据库的话是写到节点属性上的,所以要求tag 有对应的属性名,louvain算法要求属性名是 louvain
3. 你写回图数据库后,可以通过studio进行节点展示,根据你的louvain属性值进行着色

我将tag增加了louvain属性,并插入了不同的值:

请问接下来我该如何进行着色显示呢?

参考这里的回复

老师 您好!我将spark版本改为2.4之后,可以跑通,特别感谢!
我还想问两个问题:

  1. val louvainConfig = LouvainConfig(10, 5, 0.5),这三个参数分别指maxIter,internalIter和tol吗?我看了LouvainAlgo.scala中的源码,还是不太明白这三个参数分别代表什么含义呢?
  2. 针对跑出的结果

    louvain这一列是指所被划分的社区编号吗?为什么数值不连续呢?
    感谢老师解答!

为啥你觉得社区编号是连续的呢,:thinking:

也就是说louvain这一列是指社区编号吧?我之前用python做的时候,结果是下面这样:
image
我理解0 1 2 3 4 是不同的簇。
那louvain这一列的不同值也是代表不同簇吧?

您能帮我看看这三个参数代表什么意思嘛? :smile:

参考这个。

OK 看明白了! 感谢您!

因为算法内部是采用 当前社区内节点的最小id作为该社区的编号,不同社区内最小的节点id通常不连续的

1 个赞

明白了! 谢谢!! :kissing_heart:

老师您好! 我又有个问题:
我采用提交algorithm算法包的方式跑louvain算法,将application.conf中的data source和data sink都设置为nebula,nebula write中的type改为“update”。

然后运行,发生如下错误:


这个是怎么回事呢?

插入的语句过多了,试试少点小批量插入看看。

目前的数据量是:


我如果将application.conf配置文件中的nebula-write type 改为“inset”,就不会出现这个错误,但是那样会将其他属性值(比如name,age)变为NULL。

这个assert是spark connector在更新数据的时候做的校验,algorithm里面给出的默认batch是1000,这个该应改小一些,我提个pr 你可以用最新的algorithm包