具有多个属性的Spark Graphx顶点(类型不匹配 - 具有可序列化错误的产品)

时间:2018-03-27 18:32:15

标签: scala apache-spark graph

我正在尝试做什么: 我正在使用带有graphx的Spark 2.3.0。我有一个类似于菜单结构的简单DF,如下所示:Menu Structure。当我使用以下代码创建具有三个顶点属性(Int,String,String)的图形来创建Vertex 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)]

到目前为止我尝试了什么:

所以是的,我基本上已经达到了我感觉像是一个完整的砖头的地步。我觉得我在这里忽略了一些非常简单的事情,但是在玩了几天并且研究了近一天之后,现在任何帮助都会非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我想你做的不错,但是错过了通过默认的元组的操作。按照以下方式初始化图形。

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

第三个参数是“ defaultVertexAttr”,应符合顶点的数据类型