我有一个嵌套结构的数据框如下:
("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()
请告诉我如何实现这一目标。
答案 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)