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

时间:2018-05-31 06:42:40

标签: 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 = 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"),但它不起作用,它采用字段名称而不是取值。

1 个答案:

答案 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拆分数据,并将每种类型作为单独的数据框处理