使用 Spark 数据帧列值作为另一列的别名



使用 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(
map('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)

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

最新更新