从sql表创建vertexrdd

o3imoua4  于 2021-05-19  发布在  Spark
关注(0)|答案(1)|浏览(417)

我有一个表,我正在spark中加载到dataframe,它有以下模式:

verticesDf.printSchema

root
 |-- id: integer (nullable = true)
 |-- target: string (nullable = true)
 |-- batch_id: integer (nullable = true)
 |-- x: double (nullable = true)
 |-- y: double (nullable = true)
 |-- z: double (nullable = true)
 |-- size: double (nullable = true)

如何将它转换为vertexrdd,以便稍后使用它构建图形?
我尝试了以下方法:

case class SRow( target:String, batch_id:Double, x:Double, y:Double, z:Double, size:Double)
val sourceDS: Dataset[(VertexId, SRow)] = verticesDf.as[(VertexId, SRow)]
val vertVX=VertexRDD(sourceDS)

但是这个和其他很多都不能给出结果-我总是得到一些类型不匹配。正确的方法是什么?

k0pti3hp

k0pti3hp1#

至少,要创建一个图,您需要两个RDD。类型之一 RDD[(VertexId, VD)] 包含顶点的。一 VertexId 只不过是一个 Long 以及 VD 可以是任何东西,你的 Srow 例如类。另一个是rdd类型 RDD[Edge[ED]] ,在哪里 ED 类似于 VD 可以是任何东西。
这里您将讨论vextex rdd的创建。您正在尝试将Dataframe转换为类型为的数据集 Dataset[(VertexId, SRow)] . 它不起作用有两个原因。 id 是整数而不是长的,结构错误。您的Dataframe包含两个以上的列。
以下是操作方法:

val vertices = verticesDf
    .select(
       // we transform the id to a long
       'id cast "long",
       // we create a struct with the other columns that will be turned into a Srow
       struct(verticesDf.columns.tail.map(col) : _*))
    .as[(Long, SRow)]

// we also need edges, let's create a dummy RDD
val edges = sc.parallelize(Seq(Edge(1L, 2L, "test")))

// And voila
val graph: Graph[SRow,String] = Graph(vertices.rdd, edges)

请注意,在最后一行中,图形是从RDD而不是数据集创建的,因此我们需要对顶点进行转换。

相关问题