使用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
答案 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)
)