Spark 3.2 String 类型无法隐式转换为 Timestamp 类型
太长不看版:Spark 3.2 之后为了兼容 ANSI SQL 标准,修改了 Interval 的数据类型(CalendarIntervalType → YearMonthIntervalType),代码中只写了 String → CalendarIntervalType
的隐式转换规则,这里新版需要配置 spark.sql.legacy.interval.enabled=true
来让 Interval 使用旧的数据类型(CalendarIntervalType)。
问题描述
最近将项目从 Spark 2.4 升级到 Spark 3.2.2 之后发现一个 SQL 报错:
1 | scala> spark.sql("select '2022-11-12 23:33:55' - INTERVAL 3 YEAR") |
而在 Spark 2.4 中可以正常执行:
1 | scala> spark.sql("select '2022-11-12 23:33:55' - INTERVAL 3 YEAR").show |
这里可以看到,Spark 2.4 中 String
和 Interval
类型做运算时,自动将 String
类型转为了 Timestamp
类型,而在 Spark 3.2 中却把 String
类型转为了 Double
类型,导致计算报错。