scala - Spark graphX 从数据框生成 Edge/Vertex RDD
问题描述
我有 2 个大型数据框edge
和vertex
,并且我知道它们需要采用特殊类型Vertex
和Edge
RDD,但是我发现的每个教程都将Edge
和Vertex
RDD 指定为 3 到 10 个项目的数组。我需要他们直接从大量 RDD 转换。如何将数据帧/普通 RDD 更改为正确的类型?
我在这里遵循了这个例子:https ://spark.apache.org/docs/latest/graphx-programming-guide.html#example-property-graph但它列举了所有关系,在我的用例中有很多。
edge
df 有 3 列,(sourceID、destID、relationship)vertex
df 有 2 列(ID、名称)
到目前为止我已经尝试过:
val vertex: RDD[(VertexId, String)] = sc.parallelize((vertexDF("ID"), vertexDF("Name")))
返回错误:
error: type mismatch;
found : (org.apache.spark.sql.Column, org.apache.spark.sql.Column)
required: Seq[(org.apache.spark.graphx.VertexId, String)]
(which expands to) Seq[(Long, String)]
我如何将数据帧/普通 RDD 更改为专门的顶点/边 RDD 类型?
解决方案
有一个 graphframes spark 库来处理基于数据框的图。它有一种将边和顶点数据帧对转换为 GraphX RDD 的方法。请参阅: http: //graphframes.github.io/graphframes/docs/_site/user-guide.html#example-conversions。
对于您的示例,它将如下所示:
val edgeDf = .... // (sourceID, destID, relationship)
val verexDf = .... // (ID, Name)
import org.graphframes._
val g = GraphFrame(
verexDf.select($"id", $"name"),
edgeDf.select ($"sourceID" as "src", $"destID" as "dst", $"relationship"))
// Convert to GraphX
val gx: Graph[Row, Row] = g.toGraphX