使用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")
,但它不起作用,它采用字段名称而不是取值。
答案 0 :(得分:1)
那不会起作用,因为这需要事先不知道的动态模式。 你能做的最好的事情是创建一个映射:
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
拆分数据,并将每种类型作为单独的数据框处理