本文概述了 Delta Lake 协议、表功能和与 Delta Lake 客户端的兼容性,以便进行读取和写入。
Delta 表的事务日志包含协议版本控制信息。 请参阅使用 describe detail 查看 Delta Lake 表详细信息。
每个 Delta 表都有一个协议规范,该规范指示读取和写入表所需的一组功能。 协议规范由读取或写入表的应用程序使用,以确定它们是否可以处理表支持的所有功能。 如果应用程序不知道如何处理表协议中列为“受支持”的功能,则该应用程序无法读取或写入该表。
添加到 Delta Lake 的大多数新功能和功能都需要升级表协议。
下表概述了用于描述 Delta Lake 协议的关键术语:
术语 | DESCRIPTION |
---|---|
Delta Lake 客户端 | 读取或写入 Delta 表的任何系统。 |
读取协议 | 为 Delta Lake 客户端读取表指定所需的支持。 |
写入协议 | 指定 Delta Lake 客户端写入表所需的支持。 |
minReaderVersion |
读取器协议的组件。 有效值为 1 、2 或 3 。 |
minWriterVersion |
编写器协议的组件。 有效值为整数 2 到 7。 |
表功能 | 协议版本的精细替代方案。 表功能映射到可选启用的 Delta Lake 功能。 |
写作功能 | 写入协议绑定的表功能。 |
读取器功能 | 绑定到读取协议的表格功能。 |
写入协议和编写器功能仅影响与编写器客户端的兼容性,这意味着仍支持从旧工作负载对表进行只读访问。 读取协议和读取器功能会影响读取和写入兼容性。
并非所有 Delta Lake 功能彼此兼容。
启用后,无法删除某些表功能。 请参阅删除 Delta Lake 表功能并降级表协议。
在 Databricks Runtime 12.2 LTS 及更高版本中,Databricks 使用 表功能 来指示对读取器和编写器的功能和兼容性的支持。 表功能使用精细标志来指定给定表支持的功能。 表功能通过将新功能引入 Delta Lake 协议来替换旧协议版本控制方案。
表编写器功能 指示影响数据写入方式的功能。 表编写器功能需要 minWriterVersion
== 7。 作为编写器功能实现的功能不会阻止读取器客户端。
表读取器功能 指示影响数据读取方式的功能。 所有表读取器功能也是表编写器功能。 表读取器功能需要 minReaderVersion
== 3 和 minWriterVersion
== 7。 客户端无法写入无法读取的表。
启用表功能后,协议支持的所有表功能都会以readerFeatures
或writerFeatures
的形式显示在相应的列表中。 从表中删除功能时,表可能会删除此行为以解析为尽可能低的协议。 请参阅 可能的最低协议。
所有表都包含一个由minReaderVersion
和minWriterVersion
表示的基于整数的协议版本。 使用表功能实现的功能基于这些协议版本而构建,但许多旧版读取器和编写器客户端继续使用协议版本来管理兼容性。 Delta Lake 尝试将表协议解析为尽可能低的版本,以保持与新式和旧版 Delta 客户端的最大兼容性。 请参阅 可能的最低协议。
在基于整数的协议版本控制方案中,每个版本号捆绑多个功能,跨版本号的功能是累积的。 这意味着,为了符合 Delta 协议,客户端必须实现对给定版本中提供的所有读取器或编写器功能的支持,包括以前发布的所有功能。
备注
Databricks 为所有受支持的 Databricks Runtime 版本中的表功能提供不间断的部分支持。 OSS Delta 客户端选择如何实现对给定功能的支持。
表的协议在以下情况下发生更改:
- 如果启用了新功能,则会升级协议。
- 如果删除了表特性,协议将会降级。
禁用表功能 不 会导致协议降级。 必须删除该功能才能完全将其从表协议中删除。 不是所有表特性都可以删除。 请参阅删除 Delta Lake 表功能并降级表协议。
所有协议更改操作都与所有并发写入冲突。
流式读取在遇到一个更改表元数据的提交时会失败。 如果你希望流继续进行,必须重启它。 有关建议的方法,请参阅结构化流式处理的生产注意事项。
警告
大多数协议版本升级不可逆,升级协议版本可能会破坏现有的 Delta Lake 表读取器和/或写入器。 Databricks 建议你仅在需要时(例如需要选择 Delta Lake 中的新功能时)才升级特定的表。 还应检查以确保所有当前和将来的生产工具都支持具有新协议版本的 Delta Lake 表。
协议降级可用于某些功能。 请参阅删除 Delta Lake 表功能并降级表协议。
在表上启用功能时,会自动升级表协议。 某些功能会根据在CREATE
或ALTER
表语句中使用的语法自动启用,而其他功能则需要通过设置表属性来显式启用。 有时必须显式启用多个表功能才能支持所需的功能。 在其他情况下,启用功能可能会自动启用其他表功能。 请参阅 Azure Databricks 文档,了解用于确定需要哪些表功能的功能和语法。
读取器功能需要升级读取协议和写入协议。 编写器功能只需要升级写入协议。
例如,对 CHECK
约束的支持是编写器功能:仅编写应用程序需要了解约束 CHECK
并强制实施它们。
相比之下,列映射要求同时升级读取和写入协议。 由于数据在表中的存储方式不同,读取方应用程序必须了解列映射才能正确读取数据。
备注
Databricks 建议不更改 minReaderVersion
和 minWriterVersion
表属性。 更改这些表属性不会阻止协议升级。 将这些值设置得较低不会使表降级。 请参阅删除 Delta Lake 表功能并降级表协议。
默认情况下,Delta Lake 尝试使用可能的最低协议来表示表所支持的所有功能。
此行为只能导致降低表协议,这意味着表的minReaderVersion
或minWriterVersion
值可能会变更为较低。
必须运行 DROP FEATURE
该命令,才能从表协议中受支持的功能列表中删除表功能。 表格功能永远不会自动删除。
如果表中存在的所有 Delta Lake 功能在较低协议版本中完全受支持,该表可能会还原为不使用表功能来指示读取器和编写器兼容性的协议版本。 发生此协议降级时,该表协议可能会删除 readerFeatures
,或者同时删除 readerFeatures
和 writerFeatures
。 这不会导致任何 Delta Lake 功能被禁用,并且仅在表协议中不需要表功能时才发生。
降低表协议的所有更改都会提高与读取器和编写器客户端的兼容性。 这是因为读取器和编写器客户端必须遵循较低的协议版本,即使它们支持更高的协议版本。
如果你仅通过 Azure Databricks 来与 Delta 表交互,则可以使用最低 Databricks Runtime 要求继续跟踪对 Delta Lake 功能的支持。 Azure Databricks 支持读取已升级到所有 Databricks Runtime LTS 版本中的表功能的 Delta 表,前提是该版本支持该表使用的所有功能。
如果使用其他系统读取和写入 Delta 表,可能需要考虑到表功能对兼容性造成哪种影响,因为系统可能无法识别已升级的协议版本。
重要
已引入适用于 Delta Lake 写入器版本 7 和读取器版本 3 格式的表功能。 Azure Databricks 已将代码后向移植到所有受支持的 Databricks Runtime LTS 版本以添加对表功能的支持,但这些代码仅适用于该 Databricks Runtime 中已支持的那些功能。 这意味着,虽然你可以选择使用表功能来启用生成的列并仍可以在 Databricks Runtime 9.1 LTS 中使用这些表,但该 Databricks Runtime 仍然不支持已启用标识列的表(这需要 Databricks Runtime 10.4 LTS)。
Databricks 引入了对新的 Delta Lake 功能和优化的支持,这些功能和优化基于 Databricks Runtime 版本中的 Delta Lake。 利用 Delta Lake 功能的 Azure Databricks 优化遵循 OSS Delta Lake 中使用的协议以保持兼容。 许多 Azure Databricks 优化要求在表上启用 Delta Lake 功能,某些 Azure Databricks 产品(如 DLT)依赖于许多表功能。
- 较低版本的 Databricks Runtime 所写入的所有表格均在更高版本的 Databricks Runtime 中具有完全的读取和写入支持。
- 由更高 Databricks Runtime 版本编写的表可能使用较低 Databricks Runtime 版本中不支持的表功能。
- 某些功能可能允许从较低的 Databricks Runtime 版本进行写入,而无需完全应用与启用的表功能相关的所有优化。
在处理具有已回溯支持到较低版本的 Databricks Runtime 的表功能时,某些在特定 Databricks Runtime 版本上运行的操作可能无法在相应的 OSS Delta 版本上运行。 如果开发周期或数据体系结构包括 OSS Delta Lake,则应始终在 OSS Delta 客户端中测试兼容性,然后再在生产表上启用表功能。
功能是按表启用的。 下表列出了对已指示功能提供完整支持的最低 Databricks Runtime 版本。 完全支持意味着支持读取和写入操作的所有普遍可用功能。
功能 / 特点 | 需要此 Databricks Runtime 版本或更高版本 | 文档 |
---|---|---|
CHECK 约束 |
所有支持的 Databricks Runtime 版本 |
CHECK 在 Azure Databricks 中设置约束 |
更改数据馈送 | 所有支持的 Databricks Runtime 版本 | 在 Azure Databricks 上使用 Delta Lake 更改数据馈送 |
生成的列 | 所有支持的 Databricks Runtime 版本 | Delta Lake 生成的列 |
列映射 | 所有支持的 Databricks Runtime 版本 | 使用 Delta Lake 列映射重命名和删除列 |
标识列 | 所有支持的 Databricks Runtime 版本 | 在 Delta Lake 中使用标识列 |
表功能 | Databricks Runtime 12.2 LTS | 协议兼容性表的功能 |
删除向量 | Databricks Runtime 12.2 LTS | 什么是删除向量? |
TimestampNTZ | Databricks Runtime 13.3 LTS |
TIMESTAMP_NTZ 类型 |
均匀 | Databricks Runtime 13.3 LTS | 使用 Iceberg 客户端读取 Delta 表 |
Liquid 聚类 | Databricks Runtime 13.3 LTS | 将 liquid 聚类分析用于 Delta 表 |
行跟踪 | Databricks Runtime 14.3 LTS | 对 Delta 表使用行跟踪 |
类型扩展 | Databricks Runtime 15.4 LTS | 类型扩展 |
变量 | Databricks Runtime 15.4 LTS | Delta Lake 中的变体支持 |
排序规则 | Databricks Runtime 16.1 | Delta Lake 的排序规则支持 |
受保护的检查点 | Databricks Runtime 16.3 | 删除 Delta Lake 表中的功能并降级表协议 |
请参阅 Databricks Runtime 发行说明版本和兼容性。
备注
DLT 和 Databricks SQL 使用常规版本自动升级运行时环境以支持新功能。 请参阅 DLT 发行说明以及发布升级过程 和 Databricks SQL 发行说明。
OSS Delta Lake 协议对表功能进行了标准化,但某些读取器和编写器客户端尚未实现对表功能的支持,并且继续使用旧 minWriterVersion
版和 minReaderVersion
协议。
某些客户端可能不支持所有 Delta Lake 功能,包括使用旧协议版本控制的功能。 请参阅 Delta Lake 客户端的文档以确认对功能的支持。 在生产表上启用新功能之前,请始终测试兼容性。
下表显示了 Delta Lake 功能所需的最低读取协议和写入协议版本,并指明表功能是否仅需要在写入时应用,或在读取和写入时都需要应用。
备注
如果只关心 Databricks 运行时兼容性,请参阅 Azure Databricks 如何管理 Delta Lake 功能兼容性?。
功能 / 特点 | minWriterVersion |
minReaderVersion |
数据表功能 |
---|---|---|---|
基本功能 | 2 | 1 | 作家 |
CHECK 约束 |
3 | 1 | 作家 |
更改数据馈送 | 4 | 1 | 作家 |
生成的列 | 4 | 1 | 作家 |
列映射 | 5 | 2 | 读取器和编写器 |
标识列 | 6 | 1 | 作家 |
行跟踪 | 7 | 1 | 作家 |
删除向量 | 7 | 3 | 读取器和编写器 |
TimestampNTZ | 7 | 3 | 读取器和编写器 |
液体聚类分析 | 7 | 3 | 读取器和编写器 |
冰山读者 (UniForm) | 7 | 2 | 作家 (1) |
类型扩展 | 7 | 3 | 读取器和编写器 |
变体 | 7 | 3 | 读取器和编写器 |
排序规则 | 7 | 3 | 读取器和编写器 |
受保护的检查点 | 7 | 1 | 作家 |
(1):需要启用列映射。