我正在尝试做什么: 我正在使用带有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)]
到目前为止我尝试了什么:
Seq()
或flatMap()
但没有成功所以是的,我基本上已经达到了我感觉像是一个完整的砖头的地步。我觉得我在这里忽略了一些非常简单的事情,但是在玩了几天并且研究了近一天之后,现在任何帮助都会非常感激。谢谢!
答案 0 :(得分:0)
我想你做的不错,但是错过了通过默认的元组的操作。按照以下方式初始化图形。
val graph = Graph(menuVerticesRDD, menuEdgesRDD, (0, "NONE", "NONE", "NONE"))
第三个参数是“ defaultVertexAttr”,应符合顶点的数据类型