Databricks Runtime 9.1 LTS升14.3 LTS:类型转换错误处理咨询
Databricks Runtime 9.1 LTS 升级至14.3 LTS 问题解答
升级背景与遇到的错误
我们正将Databricks Runtime从9.1 LTS升级至14.3 LTS(9.1将于今年9月退役),但在库中遇到两类错误:
- [CAST_INVALID_INPUT] 类型为STRING的'01/01/1900'无法转为TIMESTAMP,通过在集群配置中设置
spark.sql.storeAssignmentPolicy为legacy解决,设置spark.sql.ansi.enabled为false无效(其默认值即为false); - [DATATYPE_MISMATCH.BINARY_OP_DIFF_TYPES] 无法解析
(coalesce(EndDate, '2078/06/01') + INTERVAL '1' YEAR),因STRING与INTERVAL YEAR类型不兼容,修改配置后仍未解决。
问题解答
1. spark.sql.storeAssignmentPolicy设为legacy是否适合长期生产使用?Databricks会移除该配置支持吗?
- 短期用
legacy配置可快速适配旧代码,但不建议长期依赖。Databricks长期趋势是向ANSI SQL兼容靠拢,legacy模式是平滑过渡的兼容选项,未来版本大概率会逐步缩减支持甚至移除。如果有50-60个库需要调整,建议制定分批迁移计划,逐步将代码修改为符合新版Runtime的类型转换逻辑,比如显式指定日期格式转换:to_timestamp('01/01/1900', 'MM/dd/yyyy'),避免后续升级再遇兼容问题。
2. 是否有其他配置可修复第二个错误?
- 这类类型不兼容问题靠配置解决的可能性极低。高版本Databricks Runtime严格限制了字符串与INTERVAL的隐式转换,这是遵循SQL规范的要求。必须修改代码,显式将字符串转为日期/时间戳类型后再进行INTERVAL运算,示例修改如下:
可根据实际日期格式调整coalesce(to_date(EndDate, 'yyyy/MM/dd'), to_date('2078/06/01', 'yyyy/MM/dd')) + INTERVAL '1' YEARto_date的格式参数。
3. 如何为全用途集群全局设置spark.sql.storeAssignmentPolicy为legacy?
- 有两种全局配置方式:
- 集群层面配置:在集群创建/编辑页面的「高级选项」→「Spark」→「Spark配置」中,添加一行配置:
spark.sql.storeAssignmentPolicy legacy,保存后启动集群即可生效; - 工作区全局配置:若要对所有全用途集群生效,可在Databricks工作区的「管理控制台」→「工作区设置」→「Spark配置」中添加上述配置项,新创建的全用途集群会自动继承,已存在的集群需重启后生效。
- 集群层面配置:在集群创建/编辑页面的「高级选项」→「Spark」→「Spark配置」中,添加一行配置:
内容的提问来源于stack exchange,提问作者Dilisha Jain
相关产品推荐
相关产品推荐

