我有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列,(源ID,destID,关系)
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类型?
答案 0 :(得分:1)
有一个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