apache-spark - 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
解决方案
不完全漂亮,但应该做的伎俩:
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)
)
推荐阅读
- java - 似乎无法让它工作。无法如我所愿地取出中位数
- r - 使用 dplyr slicemin slicemax 从数据帧中获取变量的最高和最低值的行
- reactjs - reactjs中如何将数据传递到另一个页面
- java - 你可以使用 OkHttp 的 enqueue 方法返回响应吗?
- python - 为什么 ANSI 转义码有时在 CMD 中起作用
- python - 当我得到这个“NumPy 数组到张量(不支持的对象类型浮点数)”时该怎么办。在这种特定情况下?
- javascript - Javascript:如何获取 2020-05-15T05:00:00Z 格式的日期字符串?
- docker - PermissionError: [Errno 13] Permission denied: '/.cache' - 构建 docker 镜像时出错
- java - 在 Java 中删除段落标签
- flutter - Flutter:如何制作自定义形状文本字段