如何解决HDInsight 5.1读取Databricks Delta表的版本兼容问题
在HDInsight Spark集群(版本5.1)上读取Databricks生成的Delta表时,遇到以下错误:
org.apache.spark.sql.delta.actions.InvalidProtocolVersionException: Delta protocol version is too new for this version of the Databricks Runtime. Please upgrade to a newer release.
当前环境信息:
- HDInsight版本:5.1(最新),Delta Lake版本为2.2.0.4,可通过以下Scala代码确认:
import io.delta println(io.delta.VERSION)
- Databricks侧:可选最旧Runtime版本为12.2,目标Delta表的属性如下:
| key | value |
|---|---|
| delta.feature.deletionVectors | supported |
| delta.minReaderVersion | 3 |
| delta.minWriterVersion | 7 |
上述协议版本需Delta Lake 2.3及以上支持,核心原因是启用了deletionVectors特性。已在DBR 12.2、15.4、16.4中尝试以下SQL语句创建表,但仍无法生成兼容HDInsight 5.1的Delta表:
create or replace table my_schema.my_table as (values 1,2,3 as t(x)) create or replace table my_schema.my_table TBLPROPERTIES ('delta.feature.deletionVectors' = false) as (values 1,2,3 as t(x)) create or replace table my_schema.my_table TBLPROPERTIES ('delta.enableDeletionVectors' = false, 'delta.minReaderVersion' = '1', 'delta.minWriterVersion' = '1') as (values 1,2,3 as t(x))
需求:
- 如何让Databricks生成兼容HDInsight 5.1的Delta表(比如禁用
deletionVectors)? - 是否有简便方法在HDInsight 5.1上安装Delta Lake 2.3?
方案一:在Databricks中生成兼容HDInsight 5.1的Delta表
1. 集群全局禁用Deletion Vectors
在Databricks集群的Spark配置中添加以下参数,全局关闭Deletion Vectors特性:
spark.databricks.delta.deletionVectors.enabled false
添加路径:集群配置 → Spark → 高级选项 → Spark配置,添加上述键值对。重启集群后,新创建的表默认不会启用Deletion Vectors,协议版本会回退到Delta 2.2兼容的范围。
2. 表级别强制指定兼容协议与特性
创建表时,明确指定兼容的协议版本(Delta 2.2支持minReaderVersion=2、minWriterVersion=5),同时禁用Deletion Vectors:
CREATE OR REPLACE TABLE my_schema.my_table TBLPROPERTIES ( 'delta.enableDeletionVectors' = 'false', 'delta.minReaderVersion' = '2', 'delta.minWriterVersion' = '5' ) AS (VALUES 1,2,3 AS t(x))
注意:delta.feature.deletionVectors是表创建后自动生成的属性,无法直接通过TBLPROPERTIES设置,需通过delta.enableDeletionVectors参数禁用。
3. 对已存在的表降级协议版本
如果表已创建,可通过ALTER TABLE修改属性并执行优化更新元数据:
ALTER TABLE my_schema.my_table SET TBLPROPERTIES ( 'delta.enableDeletionVectors' = 'false', 'delta.minReaderVersion' = '2', 'delta.minWriterVersion' = '5' ); OPTIMIZE my_schema.my_table;
执行后确认表属性中的协议版本已调整为兼容值,且delta.feature.deletionVectors变为unsupported。
方案二:在HDInsight 5.1上升级Delta Lake到2.3
1. 作业级别加载Delta 2.3依赖
提交Spark作业时,通过--packages指定Delta 2.3依赖,同时配置相关扩展:
spark-submit \ --packages io.delta:delta-core_2.12:2.3.0 \ --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \ --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog \ --conf spark.delta.logStore.class=org.apache.spark.sql.delta.storage.HDFSLogStore \ your_job_script.py
注意:HDInsight 5.1使用Scala 2.12、Spark 3.3,需匹配对应版本的Delta包(delta-core_2.12:2.3.0对应Spark 3.3)。
2. 集群全局安装Delta 2.3
若需所有作业默认使用Delta 2.3,可通过Ambari修改集群配置:
- 登录HDInsight集群的Ambari界面。
- 进入Spark服务 → 配置 → 高级 → spark-defaults。
- 添加以下配置:
spark.jars.packages:io.delta:delta-core_2.12:2.3.0spark.sql.extensions:io.delta.sql.DeltaSparkSessionExtensionspark.sql.catalog.spark_catalog:org.apache.spark.sql.delta.catalog.DeltaCatalog
- 重启Spark服务及相关组件。
注意事项
- 升级Delta版本后,需验证作业API与Delta 2.3的兼容性,避免API变更导致错误。
- 优先在单个作业中测试,确认无误后再全局配置,避免影响现有业务。
内容的提问来源于stack exchange,提问作者TrayMan

