我从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中执行此操作?
答案 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"))
这将为您提供所需的输出。