Scala 使用spark dataframe列值作为另一列的别名

Scala 使用spark dataframe列值作为另一列的别名,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,使用spark和scala,我想设置一个结构,并使用一个列值作为另一列的别名 我有这个数据框 root |-- type: string (nullable = true) |-- metadata |-- name: string (nullable = true) |-- age: long (nullable = true) |-- gender: string (nullable = true) |-- country: string (nullable

使用spark和scala,我想设置一个结构,并使用一个列值作为另一列的别名

我有这个数据框

root
|-- type: string (nullable = true)
|-- metadata
    |-- name: string (nullable = true)
    |-- age: long (nullable = true)
    |-- gender: string (nullable = true)
    |-- country: string (nullable = true)
我想要这个

root
|-- metadata
    |-- TYPE_VALUE
        |-- name: string (nullable = true)
        |-- age: long (nullable = true)
        |-- gender: string (nullable = true)
        |-- country: string (nullable = true)

在我的数据框架中,我尝试使用
struct($“metadata”).as($“type”.toString()).alias(“metadata”)
,但它不起作用,它使用字段名而不是值。

这是行不通的,因为这需要事先不知道的动态模式。 您所能做的最好是从中创建一个映射:

df.select(
映射('type',metadata).as(“metadata”)
)
输出如下:

+-------------------------------+
|metadata                       |
+-------------------------------+
|Map(type1 -> [Tom,38,M,NL])    |
|Map(type2 -> [Marijke,37,F,NL])|
+-------------------------------+

res1: Unit = ()
root
 |-- metadata: map (nullable = false)
 |    |-- key: string
 |    |-- value: struct (valueContainsNull = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- age: long (nullable = false)
 |    |    |-- gender: string (nullable = true)
 |    |    |-- country: string (nullable = true)

或者根据
类型拆分数据,并将每种类型作为单独的数据帧进行处理

不确定是否可以在一次传递中完成。模式是在处理之前定义的,因此我怀疑您能否在单个处理中完成它。相反,您可以尝试提取类型列,从中构建结构并转换数据帧。请插入一些您使用的代码,这将提供更多的上下文。让我用地图检查解决方案。谢谢你的回答
root
|-- type: string (nullable = true)
|-- metadata
    |-- name: string (nullable = true)
    |-- age: long (nullable = true)
    |-- gender: string (nullable = true)
    |-- country: string (nullable = true)