我想将地图下的key
重命名为name
,将_1
重命名为rownum
,将_2
重命名为status
root
|-- id: string (nullable = true)
|-- info: map (nullable = true)
| |-- key: string
| |-- value: struct (valueContainsNull = true)
| | |-- _1: long (nullable = false)
| | |-- _2: string (nullable = true)
请帮忙
答案 0 :(得分:6)
最简单,最简单的解决方案是使用新架构cast
:
val df = Seq(("1", Map("foo" -> (1L, "bar")))).toDF("id", "info")
df.withColumn(
"info",
$"info".cast("map<string,struct<rownum:long,status:string>>")
).printSchema
root
|-- id: string (nullable = true)
|-- info: map (nullable = true)
| |-- key: string
| |-- value: struct (valueContainsNull = true)
| | |-- rownum: long (nullable = true)
| | |-- status: string (nullable = true)
如果您愿意,可以使用DataType
对象代替字符串描述,但这更详细。
key
(和value
)无法重命名,因为架构中没有部分内容。
udf
可以提供另一个选项,但它在性能方面低于标准,并且需要Product
类型来表示值: