Spark graphX从数据帧中生成Edge / Vertex RDD

时间:2019-02-11 14:52:49

标签: scala apache-spark type-conversion spark-graphx

我有2个大型数据帧,edgevertex,并且我知道它们需要采用特殊类型的VertexEdge RDD,但是我所用的每个教程已发现将EdgeVertex 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类型?

1 个答案:

答案 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