Spark DataFrame MapType中的大小写不敏感匹配

时间:2019-05-23 12:29:42

标签: apache-spark

使用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

解析地图中的键时,是否有办法使字段分辨率不区分大小写?

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

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

1 个答案:

答案 0 :(得分:0)

不太漂亮,但应该可以解决问题:

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)
)