带有多个属性的Spark GraphX顶点(键入不匹配 - 具有序列化错误的产品)



我要做的事情:我正在使用graphx使用spark 2.3.0。我有一个类似于菜单结构的简单DF,例如:菜单结构。当我使用以下代码创建三个顶点属性(int,string,string(的图形以创建顶点RDD时,它可以完美工作:

val menuVerticesRDD: RDD[(VertexId, (Int,String,String))] = menuVertexDF
.rdd
.map{row: Row => (row.get(0), row.get(1), row.get(2))}
.map{x => (MurmurHash3.stringHash(x._1.toString).toLong, 
( x._1.asInstanceOf[Int], x._2.asInstanceOf[String], x._3.asInstanceOf[String] ))}

然后,我使用以下代码尝试了四个属性(int,string,string,string(完全相同的事情:

val menuVerticesRDD: RDD[(VertexId, (Int,String,String,String))] = menuVertexDF
.rdd
.map{row: Row => (row.get(0), row.get(1), row.get(2), row.get(3))}
.map{x => (MurmurHash3.stringHash(x._1.toString).toLong, (  x._1.asInstanceOf[Int], x._2.asInstanceOf[String], x._3.asInstanceOf[String], x._4.asInstanceOf[String] ))

...然后引发类型不匹配错误:

Name: Compile Error
Message: <console>:153: error: type mismatch;
found   : org.apache.spark.rdd.RDD[(org.apache.spark.graphx.VertexId, (Int,     String, String, String))]
(which expands to)  org.apache.spark.rdd.RDD[(Long, (Int, String, String, String))]
required: org.apache.spark.rdd.RDD[(org.apache.spark.graphx.VertexId, Product with Serializable)]
(which expands to)  org.apache.spark.rdd.RDD[(Long, Product with Serializable)]

我到目前为止尝试过:

  • 我检查了GraphX API docs @ https://spark.apache.org/docs/latest/api/scala/scala/index.html#org.apache.sparke.graphx.verpaphx.vertexrdd只要您将它们包裹在元组中,添加无限属性就应该存在问题。
  • 我尝试在没有成功的元组之前添加Seq()flatMap()
  • 我尝试在网上找到具有三个以上顶点属性的图形示例,但似乎没有任何
  • 我尝试使用SQL从启动DF
  • 中排除任何空值

是的,我从本质上达到了我觉得自己像一个完整的砖头的地步。我感觉自己在这里忽略了一些非常简单的东西,但是在玩耍并研究了将近一天之后,任何帮助都将不胜感激。谢谢!

我想您做得很好,但错过了默认元组。以以下方式初始化图形。

val graph = Graph(menuVerticesRDD, menuEdgesRDD, (0, "NONE", "NONE", "NONE"))

第三个参数是" defaultvertexattr",它应该遵守顶点的数据类型

最新更新