Databricks创建Delta Lake表触发AnalysisException属性不匹配问题咨询
Delta Lake建表属性不匹配异常分析
错误场景
执行以下建表语句为存量Delta数据创建外部表时触发报错:
CREATE TABLE IF NOT EXISTS AccountMember USING DELTA TBLPROPERTIES (delta.enableChangeDataFeed = true, delta.autoOptimize.optimizeWrite = true) LOCATION '/mnt/product1/data/snapshot/ATM/latest'
报错信息:
AnalysisException: The specified properties do not match the existing properties at /mnt/product1/data/snapshot/ATM/latest
根本原因
- 指定LOCATION路径下已存在存量Delta数据,其
_delta_log事务日志中已经固化了一套表属性配置,建表语句中声明的TBLPROPERTIES与存量数据记录的属性值不一致,Delta的元数据校验规则不允许两边属性冲突。 - 常见冲突点:
- 存量Delta数据的
delta.enableChangeDataFeed属性值为false,或未配置该属性,与建表语句中声明的true不匹配 - 存量Delta数据的
delta.autoOptimize.optimizeWrite属性值为false,或未配置该属性,与建表语句中声明的true不匹配 - 低版本Delta引擎写入的存量数据缺少新属性的默认值记录,也会触发校验失败
- 存量Delta数据的
验证方案
执行以下命令查询存量Delta数据的现有属性配置,对比找到不一致项:
DESCRIBE DETAIL delta.`/mnt/product1/data/snapshot/ATM/latest`;
返回结果的properties字段即为存量数据的已有表属性。
解决方案
- 若需保留建表语句中指定的属性,先修改存量Delta数据的属性配置,再执行建表语句:
ALTER TABLE delta.`/mnt/product1/data/snapshot/ATM/latest` SET TBLPROPERTIES ( delta.enableChangeDataFeed = true, delta.autoOptimize.optimizeWrite = true );
- 若无需强制指定这两个属性,直接删除建表语句中的TBLPROPERTIES配置即可,建表时会自动继承存量Delta数据的已有属性。
内容的提问来源于stack exchange,提问作者Akhilesh Jaiswal
相关产品推荐
相关产品推荐

