当前位置: 首页 > 知识库问答 >
问题:

具有多个属性的火花图x顶点(类型不匹配-具有可串行化错误的产品)

翁鸿远
2023-03-14

我想做的是:我将Spark 2.3.0与graph x一起使用。我有一个类似于菜单结构的简单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)]

到目前为止,我尝试过:

    < li >我查了graphx API docs @ https://spark . Apache . org/docs/latest/API/Scala/index . html # org . Apache . spark . graphx . vertex rdd,但是在我看来添加无限量的属性应该没有问题,只要你把它们包装在一个元组中。 < li >我尝试在元组前添加< code>Seq()或< code>flatMap()但没有成功 < li >我尝试在网上查找具有三个以上顶点属性的图形示例,但似乎没有任何示例 < li >我尝试使用SQL从起始DF中排除任何空值

所以是的,我基本上已经到了我觉得自己完全是个砖头的地步。我觉得我忽略了一些非常简单的东西,但是在玩了将近一天和研究之后,现在任何帮助都将不胜感激。谢谢!

共有1个答案

万俟飞语
2023-03-14

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

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

第三个参数是defaultVertexAttr,它应该符合顶点的数据类型。

 类似资料:
  • 我在recyclerView中遇到错误// 数据类类别( )这是模型///// 对象类别模型{ ////适配器/// 类CategoriesAdapter(private val itemList:ArrayList):RecyclerView。适配器 .充气(R.layout.memmals,parent,false)返回ViewHolder(视图) }/////主要活动/// 类MainAct

  • 我正在创建一个Titan图(由Dynamodb支持);我正在使用Titan 1.0.0并运行Gremlin Server 3(在TinkerPop3上)。 我试图在一条直线上用一个标签和多个属性向图中添加一个顶点。我可以用一个标签和一个属性添加一个顶点,在创建一个顶点后,我可以向其添加多个属性,但似乎我不能一次完成所有操作。 为了测试,我在gremlin shell中运行命令,但最终用例是通过RE

  • 问题内容: 还有其他一些SO问题在讨论可以使用Eclipse的编译器而不是javac进行泛型编译的问题(即Java:泛型在Eclipse和javac中处理不同,而泛型可以在Eclipse中编译和运行,但不能在javac中编译)-但这看起来就像一个稍微不同的人。 我有一堂课: 我还有一个带有方法的类,该方法接受来自以下类型的任意对象: 这在Eclipse中可以正常工作,但是当我使用进行了干净的构建时

  • 我想出一个例外: 在这个程序中,我尝试从hdfs路径读取记录,并将它们保存到Kafka中。问题是当我移除关于向Kafka发送记录的代码时,它运行得很好。我错过了什么?

  • 我有以下图表: 我正在寻找一种方法来计算从a发送到b和从b发送到c/d的金额之间的差异,这取决于referenceId,但不使用特定的referenceId。 所以我在寻找像下面这样的半代码: 有人知道我该怎么做吗?

  • 问题内容: 我想拥有一个Class对象,但是我想强迫它代表的任何类扩展A类并实现接口B。 我可以: 要么: 但我不能两者都做。有没有办法做到这一点? 问题答案: 实际上,你可以做你想做的事。如果要提供多个接口或一个类加接口,则必须使通配符看起来像这样: 请参见sun.com上的泛型教程,特别是页面底部的“ 绑定类型参数”部分。实际上,如果需要,你可以列出多个接口,并& InterfaceName根