如何将RDD [(String,Iterable [VertexId])]转换为DataFrame?

时间:2019-02-08 09:25:57

标签: scala apache-spark dataframe apache-spark-sql spark-graphx

我从RDD创建了一个Graphx,如下所示:

val graph = GraphLoader.edgeListFile(spark.sparkContext, fileName)
var s: VertexRDD[VertexId] = graph.connectedComponents().vertices

val nodeGraph: RDD[(String, Iterable[VertexId])] = s.groupBy(_._2) map { case (x, y) =>
  val rand = randomUUID().toString
  val clusterList: Iterable[VertexId] = y.map(_._1)
  (rand, clusterList)
}

nodeGraph的类型为RDD[(String, Iterable[VertexId])],其中的数据将采用以下格式:

(abc-def11, Iterable(1,2,3,4)), 
(def-aaa, Iterable(10,11)), 
...

我现在要做的是用它创建一个数据框,它应该像这样:

col1        col2
abc-def11   1
abc-def11   2
abc-def11   3
abc-def11   4
def-aaa     10
def-aaa     11

如何在Spark中执行此操作?

1 个答案:

答案 0 :(得分:3)

首先,使用toDF()将RDD转换为带有所需列名的数据帧。首先将Iterable[VertexId]更改为Seq[Long]是最简单的方法。

import spark.implicits._
val df = nodeGraph.map(x => (x._1, x._2.map(_.toLong).toSeq)).toDF("col1", "col2")

请注意,可以在创建nodeGraph来保存步骤时完成此操作。接下来,使用explode函数来展平数据框,

val df2 = df.withColumn("col2", explode($"col2"))

这将为您提供所需的输出。