将带有嵌套结构的ShuffleRDD转换为DataFrame

时间:2016-01-06 13:37:28

标签: apache-spark apache-spark-sql

我有一个嵌套结构的数据框如下:

("key1", List[("home", "abc", "06794")])
("key1", List[("work", "sdcsdc", "06794")])
("key1", List[("home2", "adssd", "06794")])

我想将其转换为连接列表,如下所示:

("key1", List[("home", "abc", "06794"), ("work", "sdcsdc", "06794"), ("home2", "adssd", "06794")])

我可以通过使用:

将df转换为rdd来实现
val a = df.rdd.map { case Row(k, v) => (k, List(v)) }
val myRdd = a.reduceByKey((x,y) => List(x,y).flatten)

但是,现在我无法将此rdd转换回df。我尝试了以下方法,但似乎都没有。

  • 使用toDF()转换,无法确定架构

    myRdd.toDF()
    
  • 使用案例类转换,这会给出类找不到错误:

    case class myData(keyColumn: String, addressed: List[address])
    case class address(description: String, address: String, zip: String)
    myRdd.map{(k,v) => myData(k,v)}.toDF() 
    

请告诉我如何实现这一目标。

1 个答案:

答案 0 :(得分:1)

如果不知道你是如何得到这种结构的话。对于初学者,我们可以对行进行分组和展平:

val combined = df
  .map(r => (r.getAs[String]("keyColumn"), r.getAs[Seq[Row]]("address")))
  .groupByKey
  .map{case (k, vs) => Row(k, vs.flatten)}

剩下的所有内容都是createDataFrame

val transformed = sqlContext.createDataFrame(combined, df.schema)