如何在Spark Scala中重命名struct中的列

时间:2019-03-26 05:43:06

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

我有一个数据框。就是这样-

 |-- Col1 : string (nullable = true)
 |-- Col2 : string (nullable = true)
 |-- Col3 : struct (nullable = true)
 |    |-- 513: long (nullable = true)
 |    |-- 549: long (nullable = true)

使用-

df.select("Col1","Col2","Col3.*").show

+-----------+--------+------+------+
|       Col1|    Col1|   513|   549|
+-----------+--------+------+------+
| AAAAAAAAA |  BBBBB |    39|    38|
+-----------+--------+------+------+

现在我想重命名

    +-----------+--------+---------+--------+
    |       Col1|    Col1| Col3=513|Col3=549|
    +-----------+--------+---------+--------+
    | AAAAAAAAA |  BBBBB |       39|      38|
    +-----------+--------+---------+--------+

struct中的列是动态的。所以我不能使用withColumnRenamed

1 个答案:

答案 0 :(得分:0)

当您询问重命名insude结构时,可以使用Schema DSL来实现:

import org.apache.spark.sql.types._

val schema: StructType = df.schema.fields.find(_.name=="Col3").get.dataType.asInstanceOf[StructType]
val newSchema = StructType.apply(schema.fields.map(sf => StructField.apply("Col3="+sf.name,sf.dataType)))

df
  .withColumn("Col3",$"Col3".cast(newSchema))
  .printSchema()

给予

root
 |-- Col1: string (nullable = true)
 |-- Col2: string (nullable = true)
 |-- Col3: struct (nullable = false)
 |    |-- Col3=513: long (nullable = true)
 |    |-- Col3=549: long (nullable = true)

然后,您可以使用select($"col3.*")打开包装。

您还可以先解压缩该结构,然后重命名所有具有数字的列作为列名...