Delta Lake 如何管理功能兼容性?
许多 Delta Lake 优化需要启用表上的 Delta Lake 特性。Delta Lake 特性总是向后兼容的,因此较低 Delta Lake 版本写入的表总是可以由较高 Delta Lake 版本读取和写入。启用某些特性会破坏与较低 Delta Lake 版本中运行的工作负载的前向兼容性。对于破坏前向兼容性的特性,您必须更新所有引用已升级表的工作负载,以使用兼容的 Delta Lake 版本。
哪些 Delta Lake 功能需要客户端升级?
标题为“哪些 Delta Lake 功能需要客户端升级?”的部分以下 Delta Lake 特性会破坏前向兼容性。特性是按表启用的。
特性 | 需要 Delta Lake 版本或更高版本 | 文档 |
---|---|---|
CHECK 约束 | Delta Lake 0.8.0 | CHECK 约束 |
生成列 | Delta Lake 1.0.0 | 使用生成列 |
列映射 | Delta Lake 1.2.0 | Delta 列映射 |
变更数据流 | Delta Lake 2.0.0 | 变更数据流 |
删除向量 | Delta Lake 2.3.0 | 什么是删除向量? |
表特性 | Delta Lake 2.3.0 | 什么是表特性? |
不带时区的时间戳 | Delta Lake 2.4.0 | TimestampNTZType |
Iceberg 兼容性 V1 | Delta Lake 3.0.0 | IcebergCompatV1 |
Iceberg 兼容性 V2 | Delta Lake 3.1.0 | IcebergCompatV2 |
V2 检查点 | Delta Lake 3.0.0 | V2 检查点规范 |
域元数据 | Delta Lake 3.0.0 | 域元数据规范 |
聚簇 | Delta Lake 3.1.0 | 为 Delta 表使用液态集群 |
行跟踪 | Delta Lake 3.2.0 | 为 Delta 表使用行跟踪 |
类型扩展(预览) | Delta Lake 3.2.0 | Delta 类型拓宽 |
类型扩展 | Delta Lake 4.0.0 | Delta 类型拓宽 |
标识列 | Delta Lake 3.3.0 | 使用标识列 |
变体类型 | Delta Lake 4.0.0 | Delta 类型拓宽 |
变体分片(预览) | Delta Lake 4.0.0 | 变体分片 |
检查点保护 | Delta Lake 4.0.0 | 检查点保护 |
什么是表协议规范?
标题为“什么是表协议规范?”的部分每个 Delta 表都有一个协议规范,它指示表支持的功能集。协议规范由读取或写入表的应用程序使用,以确定它们是否可以处理表支持的所有功能。如果应用程序不知道如何处理表中协议中列出的受支持功能,则该应用程序将无法读取或写入该表。
协议规范分为两个组件:*读取协议*和*写入协议*。
读取协议
标题为“读取协议”的部分读取协议列出了表支持的所有功能,应用程序必须理解这些功能才能正确读取表。升级表的读取协议要求所有读取器应用程序都支持添加的功能。
写入协议
标题为“写入协议”的部分写入协议列出了表支持的所有功能,应用程序必须理解这些功能才能正确写入表。升级表的写入协议要求所有写入器应用程序都支持添加的功能。它不影响只读应用程序,除非读取协议也已升级。
哪些协议必须升级?
标题为“哪些协议必须升级?”的部分某些特性需要同时升级读取协议和写入协议。其他特性只需要升级写入协议。
例如,对 CHECK
约束的支持是写入协议特性:只有写入应用程序需要了解 CHECK
约束并强制执行它们。
相比之下,列映射需要同时升级读取协议和写入协议。因为数据在表中存储方式不同,读取器应用程序必须理解列映射才能正确读取数据。
有关升级的更多信息,请参阅升级协议版本。
什么是表特性?
标题为“什么是表特性?”的部分在 Delta Lake 2.3.0 及更高版本中,Delta Lake 表特性引入了细粒度标志,指定给定表支持哪些特性。表特性是协议版本的后继者,旨在为读取和写入 Delta Lake 的客户端提供更高的灵活性。请参阅什么是协议版本?。
Delta 表特性是一个标记,指示表支持特定特性。每个特性要么是写入协议特性(意味着它只升级写入协议),要么是读/写协议特性(意味着读写协议都升级以启用该特性)。
要了解 Delta Lake 中支持的表特性的更多信息,请参阅Delta Lake 协议。
表特性是否会改变 Delta Lake 特性的启用方式?
标题为“表特性是否会改变 Delta Lake 特性的启用方式?”的部分如果您只通过 Delta Lake 与 Delta 表交互,您可以继续使用最低 Delta Lake 要求来跟踪 Delta Lake 特性的支持。如果您使用其他系统从 Delta 表读取和写入,您可能需要考虑表特性如何影响兼容性,因为存在系统可能无法理解已升级协议版本的风险。
什么是协议版本?
标题为“什么是协议版本?”的部分协议版本是一个协议号,指示特定的表特性分组。在 Delta Lake 2.3.0 及更早版本中,您不能单独启用表特性。协议版本捆绑了一组特性。
Delta 表为读取协议和写入协议指定了单独的协议版本。Delta 表的事务日志包含支持 Delta Lake 演进的协议版本信息。
协议版本捆绑了以前协议中的所有特性。请参阅按协议版本划分的特性。
按协议版本划分的特性
标题为“按协议版本划分的特性”的部分下表显示了 Delta Lake 特性所需的最低协议版本。
特性 | minWriterVersion | minReaderVersion | 文档 |
---|---|---|---|
基本功能 | 2 | 1 | 欢迎来到 Delta Lake 文档 |
CHECK 约束 | 3 | 1 | CHECK 约束 |
变更数据流 | 4 | 1 | 变更数据流 |
生成列 | 4 | 1 | 使用生成列 |
列映射 | 5 | 2 | Delta 列映射 |
标识列 | 6 | 1 | 使用标识列 |
表特性读取 | 7 | 1 | 什么是表特性? |
表特性写入 | 7 | 3 | 什么是表特性? |
删除向量 | 7 | 3 | 什么是删除向量? |
不带时区的时间戳 | 7 | 3 | TimestampNTZType |
Iceberg 兼容性 V1 | 7 | 2 | IcebergCompatV1 |
V2 检查点 | 7 | 3 | V2 检查点规范 |
真空协议检查 | 7 | 3 | 真空协议检查规范 |
行跟踪 | 7 | 3 | 为 Delta 表使用行跟踪 |
类型扩展(预览) | 7 | 3 | Delta 类型拓宽 |
类型扩展 | 7 | 3 | Delta 类型拓宽 |
变体类型 | 7 | 3 | 变体类型 |
变体分片(预览) | 7 | 3 | 变体分片 |
升级协议版本
标题为“升级协议版本”的部分您可以选择手动将表更新到较新的协议版本。我们建议使用支持表所需的 Delta Lake 特性的最低协议版本。升级写入器协议可能比升级读取器协议造成的干扰小,因为使用旧 Delta Lake 版本的系统和工作负载仍然可以从表中读取,即使它们不支持更新的写入器协议。
要将表升级到较新的协议版本,请使用 DeltaTable.upgradeTableProtocol
方法
-- 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')
from delta.tables import DeltaTable delta =DeltaTable.forPath(spark, "path_to_table") # or DeltaTable.forNamedelta.upgradeTableProtocol(1, 3) # upgrades to readerVersion=1,writerVersion=3
import io.delta.tables.DeltaTableval delta = DeltaTable.forPath(spark, "path_to_table") // or DeltaTable.forNamedelta.upgradeTableProtocol(1, 3) // Upgrades to readerVersion=1, writerVersion=3.