Spark:从平面框架创建嵌套数据框架

时间:2019-07-18 08:39:21

标签: apache-spark dataframe apache-spark-sql schema

从以下数据框中:

import spark.implicits._
val data = Seq(
  (1, "value11", "value12"),
  (2, "value21", "value22"),
  (3, "value31", "value32")
)
val df = data.toDF("id", "v1", "v2")

是否可以将df转换为嵌套数据框,其架构为:

val schema = StructType(Array(
  StructField("id", IntegerType),
  StructField("nested", StructType(Array(
    StructField("value1", StringType),
    StructField("value2", StringType)
    )))
  ))

我知道有一个RDD解决方案:

spark.createDataFrame(df.rdd.map(row => Row(row.get(0), Row(row.get(1), row.get(2))), schema)

但是我想将其动态地应用于许多列,这将导致很多样板代码。

有没有更简单的方法? 谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用的一种方法是使用struct

如果需要,您还可以重命名列

val newColumns = List("value1", "value2")
columns.zip(newColumns).foldLeft(df){(acc, name) =>
  acc.withColumnRenamed(name._1, name._2)
}

//list the columns names you want to nested 
val columns = df.columns.tail

//use struct to create new fields and drop all columns 
val finalDF = df.withColumn("nested", struct(columns.map(col(_)):_*))..drop(columns:_*)

最终模式:

finalDF.printSchema()

root
 |-- id: integer (nullable = false)
 |-- nested: struct (nullable = false)
 |    |-- v1: string (nullable = true)
 |    |-- v2: string (nullable = true)