首页 > 解决方案 > spark数据框MapType中不区分大小写的匹配

问题描述

使用 spark 2.4.1,我试图以不区分​​大小写的方式从 MapType 获取键值,但 spark 似乎没有遵循 spark.sql.caseSensitive=false

开始火花: spark-shell --conf spark.sql.caseSensitive=false

给定数据框:

val df = List(Map("a" -> 1), Map("A" -> 2)).toDF("m")
+--------+
|       m|
+--------+
|[a -> 1]|
|[A -> 2]|
+--------+

并且执行其中任何一个都只会返回一行。(在映射的键中区分大小写,但在列名中不区分大小写)

df.filter($"M.A".isNotNull).count
df.filter($"M"("A").isNotNull).count
df.filter($"M".getField("A").isNotNull).count

在解析地图中的键时,有没有办法让字段解析不区分大小写?

更新: 我研究了火花代码,发现它可能是一个错误/功能。看起来它使用简单的 StringType 排序调用 GetMapValue (complexTypeExtractors.scala),而不是像在 GetStructField 中那样使用不区分大小写的解析器。

我为此填写了一个 JIRA:SPARK-27820

标签: apache-spark

解决方案


不完全漂亮,但应该做的伎俩:

import org.apache.spark.sql.functions._

df.select(
  // Re-create the map
  map_from_arrays(
    // Convert keys to uppercase
    expr("transform(map_keys(m), x -> upper(x))"),
    // Values
    map_values($"m")
  )("A".toUpperCase)
)

推荐阅读