Spark scala重命名地图列

时间:2017-09-07 11:18:03

标签: scala apache-spark

我想将地图下的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)

请帮忙

1 个答案:

答案 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类型来表示值: