Delta Lake 功能兼容性与协议标准

Delta Lake 表协议指定客户端必须支持哪些功能来读取或写入表。 本页介绍协议版本、表功能、兼容性要求以及Azure Databricks如何管理协议升级。 另请参阅 “查看表详细信息”详细信息

表协议和兼容性

每个 Delta Lake 表都有一个协议规范,该规范指示从表读取和写入表所需的一组功能。 应用程序使用协议规范来确定它们是否可以支持表使用的所有功能。 如果应用程序不支持表的当前协议中的功能,则该应用程序无法读取或写入该表。

Delta Lake 的大多数新功能都需要升级表协议。

下表列出了描述 Delta Lake 协议的关键术语:

条款 说明
Delta Lake 客户端 读取或写入 Delta Lake 表的任何系统。
读取协议 为 Delta Lake 客户端读取表指定所需的支持。
写入协议 指定 Delta Lake 客户端写入表所需的支持。
minReaderVersion 读取器协议的整数值。 有效值为 123
minWriterVersion 编写器协议的整数值。 有效值为整数27
表功能 在 = 3 和 minWriterVersion = 7 时minReaderVersion使用的协议版本的精细替代方法。 表功能与可以选择启用的 Delta Lake 功能相对应。
编写器功能 需要写入客户端支持的表功能,但不阻止只读访问。
读取器功能 需要读取和写入客户端支持的表功能。 请参阅 协议版本和表功能

写入协议和编写器功能仅影响与编写器客户端的兼容性,允许从旧工作负载对表进行只读访问。

并非所有 Delta Lake 功能彼此兼容。

启用后,无法删除某些表功能。 请参阅删除 Delta Lake 表功能并降级表协议

协议版本和表功能

所有 Delta Lake 表都包含由和minWriterVersion表示minReaderVersion的基于整数的协议版本。 每个版本将多个功能捆绑在一起,并且功能跨版本累积。 为了符合 Delta Lake 协议,客户端必须对给定版本中的所有功能(包括以前发布的所有功能)实施支持。

在 Databricks Runtime 12.2 LTS 及更高版本中, 表功能 将基于整数的协议替换为指示表使用的功能的精细标志。 这样,客户端和表之间就可以进行精细的兼容性检查。

表写入器功能 会影响写入数据的方式。 它们需要 minWriterVersion=7 但不阻止读取器客户端。

表读取器功能 会影响数据读取方式。 所有读取器功能也是编写器功能,需要 minReaderVersion=3minWriterVersion=7。 客户端无法写入无法读取的表。

启用表功能后,它们将作为或出现在writerFeatures协议readerFeatures中。 Delta Lake 将表协议解析为支持所有已启用功能的最低版本。 请参阅 可能的最低协议

注释

Azure Databricks包括对所有受支持的 Databricks Runtime 版本中表功能的非中断性部分支持。 OSS Delta Lake 客户端选择如何实现对给定功能的支持。

协议更改

表的协议在以下情况下发生更改:

  • 如果启用了新功能,则会升级协议。
  • 如果删除了表特性,协议将会降级。

关闭表功能不会导致协议降级。 必须删除该功能才能完全将其从协议中删除。 不是所有表特性都可以删除。 请参阅删除 Delta Lake 表功能并降级表协议

所有协议更改操作都与并发写入冲突。 流式读取在遇到更改表元数据的提交操作时会失败。 若要继续,请重启受影响的流。 有关建议的方法,请参阅结构化流式处理的生产注意事项

注释

Databricks 建议不要直接更改 minReaderVersionminWriterVersion 表属性。 更改这些属性不会阻止协议升级,并且将其设置为较低的值不会降级表。 请参阅删除 Delta Lake 表功能并降级表协议

触发协议升级的内容

启用功能时,会自动升级表协议。

协议升级通过以下方式触发:

  • 根据在语句ALTER中使用的CREATE语法自动启用。 例如,在语句中CREATE TABLECLUSTER BY自动启用液体聚类分析,并GENERATED ALWAYS AS启用生成的列。
  • 通过表属性显式启用。 例如,设置 'delta.enableDeletionVectors' = true 启用删除向量。
  • 启用功能可能会自动启用所需的功能。 例如,启用 UniForm 会自动启用列映射,启用液体聚类分析会自动启用检查点 V2。 查看相关Azure Databricks文档,以确定给定功能需要哪些表功能。

读取器功能同时升级读取和写入协议。 例如,列映射是一项读取器功能,需要升级这两种协议,因为数据存储在存储中的方式不同。

编写器功能(如 CHECK 约束)仅升级写入协议。

Warning

大多数协议版本升级不可逆,可能会中断现有的 Delta Lake 表读取器、编写器或两者。 仅在需要时升级特定表,并验证所有当前和将来的生产工具是否支持新的协议版本。

协议降级可用于某些功能。 请参阅删除 Delta Lake 表功能并降级表协议

可能的最低协议

Delta Lake 将表协议解析为支持所有已启用功能的最低版本。 这只能降低 minReaderVersionminWriterVersion永远不会提高它们。 表功能永远不会自动删除。 用于 DROP FEATURE 从协议中删除表功能。

如果在基于整数的较低协议版本完全支持所有启用的功能,该表可能会还原到该版本,并从该协议中删除 readerFeatureswriterFeatures 退出该协议。 这不会禁用任何功能。 较低的协议版本会增加兼容性,因为所有客户端都必须尊重它们。

Azure Databricks和 Databricks Runtime 兼容性

Azure Databricks引入了对 Databricks Runtime 版本中新的 Delta Lake 功能的支持:

  • 由较低 Databricks Runtime 版本编写的表在更高的 Databricks Runtime 版本中具有完全读取和写入支持。
  • 由更高 Databricks Runtime 版本编写的表可能使用较低 Databricks Runtime 版本中不支持的表功能。
  • 某些功能允许从较低的 Databricks Runtime 版本写入,而无需完全应用启用的功能的所有优化。

如果仅通过 Azure Databricks 使用 Delta Lake 表,则只需使用最低 Databricks Runtime 要求来跟踪功能支持。 如果从外部系统读取或写入表,则必须验证这些客户端是否支持表上启用的表功能。

后移植表功能支持

在 Databricks Runtime 12.2 LTS 及更高版本中, 表功能 将基于整数的协议替换为指示表使用的功能的精细标志。

Azure Databricks支持 Databricks Runtime 11.3 LTS 及更低版本,而不是仅支持整数协议版本,而仅适用于该版本中已支持的功能。

例如,可以在 Databricks Runtime 9.1 LTS 中使用表功能读取和写入生成的列的表。 但是,无法使用 Databricks Runtime 9.1 LTS 读取和写入使用表功能启用标识列的表,因为标识列需要 Databricks Runtime 10.4 LTS 及更高版本。

将表功能用于支持后移植时,给定 Databricks Runtime 版本中提供的某些操作可能不适用于相应的 OSS Delta Lake 版本。 如果体系结构包括 OSS Delta Lake 客户端,请在在生产表上启用表功能之前测试兼容性。

Delta Lake 功能和所需的 Databricks Runtime 版本

下表列出了 Databricks Runtime 版本,对每项功能提供完全支持,因此支持读取和写入的所有正式版功能。

功能 需要此 Databricks Runtime 版本或更高版本 Documentation
CHECK 约束 所有支持的 Databricks Runtime 版本 CHECK 约束
更改数据流 所有支持的 Databricks Runtime 版本 在Azure Databricks上使用更改数据馈送
生成的列 所有支持的 Databricks Runtime 版本 Delta Lake 生成的列
列映射 所有支持的 Databricks Runtime 版本 使用 Delta Lake 列映射重命名和删除列
标识列 所有支持的 Databricks Runtime 版本 标识列
表格功能 所有支持的 Databricks Runtime 版本 协议版本和表功能
删除矢量 所有支持的 Databricks Runtime 版本 Databricks 中的删除向量
TimestampNTZ Databricks Runtime 13.3 LTS TIMESTAMP_NTZ 类型
UniForm Databricks Runtime 13.3 LTS 使用 UniForm 读取 Iceberg 客户端的 Delta Lake 表
液体聚类分析 Databricks Runtime 13.3 LTS 对表格使用液体聚类
行跟踪 Databricks Runtime 14.3 LTS Azure Databricks中的行跟踪
类型拓宽 Databricks Runtime 15.4 LTS 类型拓宽
变量 Databricks Runtime 15.4 LTS Apache Iceberg 和 Delta Lake 的变体类型支持
排序规则 Databricks Runtime 16.1 Delta Lake 的排序规则支持
受保护的检查点 Databricks Runtime 16.3 删除 Delta Lake 表功能和降级表协议
目录提交 Databricks Runtime 16.4 LTS 目录提交

请参阅 Databricks Runtime 发行说明版本和兼容性

注释

Lakeflow Spark 声明性管道和 Databricks SQL 使用常规版本自动升级运行时环境以支持新功能。 请参阅 Lakeflow Spark 声明性管道发行说明以及发布升级过程Databricks SQL 发行说明

按协议版本划分的功能

注释

有关 Databricks Runtime 兼容性,请参阅Azure Databricks和 Databricks Runtime 兼容性

Delta Lake 使用单独的 minReaderVersionminWriterVersion 值来指定协议功能。 开源 Delta Lake 协议已标准化表功能,但某些客户端仍使用旧协议版本控制。 由于某些客户端可能不支持所有功能,Databricks 建议在启用生产表上的新功能之前使用客户端文档进行验证并测试兼容性。

Apache Iceberg 使用单个 format-version 而不是单独的读取器和编写器版本。 Iceberg 格式版本指示哪些功能可用,但不强制使用这些功能。 功能是可选择启用的,但行跟踪在格式版本 3 中是必需的。 当冰山列中的某个功能显示 N/A 时,它是一个特定于增量的功能,没有直接的 Iceberg 等效功能。

下表列出了 Delta Lake 和 Apache Iceberg 表功能的协议版本要求。 特征类型指示某个特征是仅需要在写入时遵循,还是在读取和写入时都需遵循。

功能 三角洲 minWriterVersion 三角洲 minReaderVersion 冰山 format-version 功能类型
基本功能 2 1 1 作家
CHECK 约束 3 1 N/A 作家
更改数据馈送 4 1 N/A 作家
生成的列 4 1 N/A 作家
列映射 5 2 N/A 读取器和编写器
标识列 6 1 N/A 作家
行跟踪 7 1 3 作家
删除向量 7 3 3 读取器和编写器
TimestampNTZ 7 3 1 读取器和编写器
液体聚类分析 7 3 1 读者和作家 (1)
冰山读者 (UniForm) 7 2 N/A 作家 (2)
类型拓宽 7 3 N/A 读取器和编写器
变量 7 3 3 读取器和编写器
变体粉碎 7 3 3 读取器和编写器
排序规则 7 3 N/A 读取器和编写器
受保护的检查点 7 1 N/A 作家
目录提交 7 3 N/A 读取器和编写器

(1):液体聚类实现隐藏分区。

(2):需要启用列映射。