Azure Databricks 如何管理 Delta Lake 功能兼容性?

Delta Lake 是一个独立的开源项目,由 Linux Foundation 管理。 Databricks 引入了对新的 Delta Lake 功能和优化的支持,这些功能和优化基于 Databricks Runtime 版本中的 Delta Lake。

利用 Delta Lake 功能的 Azure Databricks 优化遵循 OSS Delta Lake 中使用的协议以保持兼容。

许多 Azure Databricks 优化需要在表上启用 Delta Lake 功能。 Delta Lake 功能始终后向兼容,因此在较低 Databricks Runtime 版本中编写的表始终可以在较高 Databricks Runtime 版本中读取和写入。 启用某些功能会破坏与在较低 Databricks Runtime 版本中运行的工作负载的前向兼容性。 对于破坏前向兼容性的功能,必须更新所有引用已升级表的工作负载,以使用兼容的 Databricks Runtime 版本。

注意

可以删除 Azure Databricks 上的 deletionVectorsv2Checkpoint。 请参阅删除 Delta 表功能

哪些 Delta Lake 功能需要进行 Databricks Runtime 升级?

以下 Delta Lake 功能会破坏前向兼容性。 功能是按表启用的。 下表列出了 Azure Databricks 仍然支持的最低 Databricks Runtime 版本。

Feature 需要此 Databricks Runtime 版本或更高版本 文档
CHECK constraints Databricks Runtime 9.1 LTS 在 Azure Databricks 中设置 CHECK 约束
更改数据馈送 Databricks Runtime 9.1 LTS 在 Azure Databricks 上使用 Delta Lake 更改数据馈送
生成的列 Databricks Runtime 9.1 LTS 使用 Delta Lake 生成的列
列映射 Databricks Runtime 10.4 LTS 使用 Delta Lake 列映射重命名和删除列
标识列 Databricks Runtime 10.4 LTS 在 Delta Lake 中使用标识列
表功能 Databricks Runtime 12.1(不受支持) 什么是表功能?
删除向量 Databricks Runtime 12.1(不受支持) 什么是删除向量?
TimestampNTZ Databricks Runtime 13.0(不受支持) TIMESTAMP_NTZ 类型
UniForm Databricks Runtime 13.2 Iceberg 与 Delta 表兼容性的通用格式 (UniForm)
Liquid 聚类 Databricks Runtime 13.3 LTS 将 liquid 聚类分析用于 Delta 表

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

注意

Delta Live Tables 和 Databricks SQL 随定期发布的版本自动升级运行时环境,以支持新功能。 请参阅 Delta Live Tables 发行说明和版本升级过程Databricks SQL 发行说明

什么是表协议规范?

每个 Delta 表都有一个协议规范,用于指示该表支持的功能集。 读取或写入表的应用程序使用协议规范来确定它们是否可以处理该表支持的所有功能。 如果应用程序不知道如何处理表协议中列为“受支持”的功能,则该应用程序无法读取或写入该表。

协议规范由两个部分组成:读取协议和写入协议。

读取协议

读取协议列出了表支持的所有功能,以及应用程序要正确读取该表而必须了解的所有功能。 所有读取方应用程序必须支持添加的功能才能升级表的读取协议。

重要

所有写入 Delta 表的应用程序必须能够构造该表的快照。 因此,写入 Delta 表的工作负载必须遵守读取器和写入器协议要求。

如果你遇到 Azure Databricks 上的工作负载不支持的协议,必须升级到支持该协议的更高 Databricks Runtime 版本。

写入协议

写入协议列出了表支持的所有功能,以及应用程序要正确写入该表而必须了解的所有功能。 所有写入方应用程序必须支持添加的功能才能升级表的写入协议。 它不会影响只读应用程序,除非读取协议也已升级。

必须升级哪些协议?

有些功能要求同时升级读取协议和写入协议。 还有些功能只要求升级写入协议。

例如,CHECK 约束支持是一项写入协议功能:只有写入方应用程序需要了解并实施 CHECK 约束。

相比之下,列映射要求同时升级读取和写入协议。 由于数据在表中的存储方式不同,读取方应用程序必须了解列映射才能正确读取数据。

有关升级的详细信息,请参阅升级协议版本

什么是表功能?

在 Databricks Runtime 12.1 及更高版本中,Delta Lake 表功能引入了细化的标志用于指定给定的表支持哪些功能。 在 Databricks Runtime 12.0 及更低版本中,Delta Lake 功能是在称为“协议版本”的捆绑包中启用的。 表功能是协议版本的后继功能,旨在提高读取和写入 Delta Lake 的客户端的灵活性。 请参阅什么是协议版本?

注意

表功能具有协议版本要求。 请参阅按协议版本划分的功能

Delta 表功能是指示该表支持特定功能的标记。 每个功能要么是写入协议功能(即它只升级写入协议),要么是读/写协议功能(即同时升级读取和写入协议以启用该功能)。

若要详细了解 Delta Lake 中支持的表功能,请参阅 Delta Lake 协议

表功能是否会更改 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 Runtime 12.0 及更低版本中,无法单独启用表功能。 协议版本捆绑了一组功能。

Delta 表为读取协议和写入协议指定了单独的协议版本。 Delta 表的事务日志包含支持 Delta Lake 演变的协议版本控制信息。 请参阅使用 describe detail 查看 Delta Lake 表详细信息

协议版本捆绑了先前协议的所有功能。 请参阅按协议版本划分的功能

注意

从写入器版本 7 和读取器版本 3 开始,Delta Lake 引入了表功能的概念。 使用表功能,你现在可以选择仅启用数据生态系统中其他客户端支持的那些功能。 请参阅什么是表功能?

按协议版本划分的功能

下表显示了 Delta Lake 功能所需的最低协议版本。

注意

如果你只关心 Databricks Runtime 兼容性,请参阅哪些 Delta Lake 功能需要进行 Databricks Runtime 升级?。 Delta Sharing 仅支持读取具有需要 minReaderVersion = 1 的功能的表。

功能 minWriterVersion minReaderVersion 文档
基本功能 2 1 什么是 Delta Lake?
CHECK constraints 3 1 在 Azure Databricks 中设置 CHECK 约束
更改数据馈送 4 1 在 Azure Databricks 上使用 Delta Lake 更改数据馈送
生成的列 4 1 使用 Delta Lake 生成的列
列映射 5 2 使用 Delta Lake 列映射重命名和删除列
标识列 6 2 在 Delta Lake 中使用标识列
表功能读取 7 1 什么是表功能?
表功能写入 7 3 什么是表功能?
删除向量 7 3 什么是删除向量?
TimestampNTZ 7 3 TIMESTAMP_NTZ 类型
Liquid 聚类 7 3 将 liquid 聚类分析用于 Delta 表
UniForm 7 2 Iceberg 与 Delta 表兼容性的通用格式 (UniForm)

升级协议版本

你可以选择手动将表更新到较新协议版本。 Databricks 建议使用支持表所需的 Delta Lake 功能的最低协议版本。 升级写入器协议所造成的中断可能不如升级读取器协议那么严重,因为使用旧 Databricks Runtime 版本的系统和工作负载仍可以从表中读取,即使它们不支持已更新的写入器协议。

警告

协议版本升级不可逆,升级协议版本可能会破坏现有的 Delta Lake 表读取器和/或写入器。 Databricks 建议你仅在需要时(例如需要选择 Delta Lake 中的新功能时)才升级特定的表。 还应检查以确保所有当前和将来的生产工具都支持具有新协议版本的 Delta Lake 表。

若要将表升级到更新的协议版本,请使用 DeltaTable.upgradeTableProtocol 方法:

SQL

-- Upgrades the reader protocol version to 1 and the writer protocol version to 3.
ALTER TABLE <table-identifier> SET TBLPROPERTIES('delta.minReaderVersion' = '1', 'delta.minWriterVersion' = '3')

Python

from delta.tables import DeltaTable
delta = DeltaTable.forPath(spark, "path_to_table") # or DeltaTable.forName
delta.upgradeTableProtocol(1, 3) # upgrades to readerVersion=1, writerVersion=3

Scala

import io.delta.tables.DeltaTable
val delta = DeltaTable.forPath(spark, "path_to_table") // or DeltaTable.forName
delta.upgradeTableProtocol(1, 3) // Upgrades to readerVersion=1, writerVersion=3.