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 Checkpoint Spec

领域元数据

Delta Lake 3.0.0

Domain Metadata Spec

聚类

Delta Lake 3.1.0

对Delta表使用液态聚类

行追踪

Delta Lake 3.2.0

对Delta表使用行追踪

类型扩展(预览版)

Delta Lake 3.2.0

Delta type widening

标识列

Delta Lake 3.3.0

使用标识列

提交内时间戳

Delta Lake 3.3.0

使用标识列

什么是表协议规范?

每个Delta表都有一个协议规范,用于说明该表支持的功能集。读取或写入表的应用程序会使用协议规范来确定它们是否能处理表支持的所有功能。如果某个应用程序不知道如何处理表中协议列出的某个支持功能,则该应用程序将无法读取或写入该表。

协议规范分为两个组成部分:读取协议写入协议

读取协议

读取协议列出了表支持的所有特性,应用程序必须理解这些特性才能正确读取表。升级表的读取协议要求所有读取应用程序都支持新增的特性。

重要

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

如果您遇到Delta Lake工作负载不支持的协议,必须升级到支持更全面的更高版本Delta Lake实现。

写入协议

写入协议列出了表支持的所有特性,应用程序必须理解这些特性才能正确写入表。升级表的写入协议要求所有写入应用程序都支持新增的特性。这不会影响只读应用程序,除非读取协议也进行了升级。

哪些协议必须升级?

某些功能需要同时升级读取协议和写入协议。其他功能则只需要升级写入协议。

例如,对CHECK约束的支持是一个写入协议特性:只有写入应用程序需要了解CHECK约束并强制执行它们。

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

有关升级的更多信息,请参阅升级协议版本

什么是表特性?

在Delta Lake 2.3.0及以上版本中,Delta Lake表特性引入了细粒度的标志,用于指定特定表支持哪些功能。表特性是协议版本的继任者,其设计目标是为读写Delta Lake的客户端提供更好的灵活性。参见什么是协议版本?

注意

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

Delta表特性是一种标记,表示该表支持特定功能。每个特性要么是写入协议特性(意味着仅升级写入协议),要么是读写协议特性(意味着读写协议都需升级以启用该功能)。

要了解更多关于Delta Lake支持的表特性,请参阅Delta Lake协议

表特性会影响Delta Lake功能的启用方式吗?

如果您仅通过Delta Lake与Delta表交互,可以继续根据最低Delta Lake要求来跟踪功能支持情况。但如果使用其他系统读写Delta表,则可能需要考虑表功能对兼容性的影响,因为存在系统无法理解升级后协议版本的风险。

什么是协议版本?

协议版本是一个协议编号,表示一组特定的表功能。在Delta Lake 2.3.0及以下版本中,您无法单独启用表功能。协议版本将一组功能捆绑在一起。

Delta表为读取协议和写入协议指定了独立的协议版本。Delta表的交易日志包含支持Delta Lake演进的协议版本信息。

协议版本包含了之前所有协议的功能特性。详见各协议版本功能对照

注意

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

按协议版本划分的功能

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

功能

minWriterVersion

minReaderVersion

文档

基础功能

2

1

欢迎来到Delta Lake文档

CHECK 约束

3

1

CHECK约束

变更数据馈送

4

1

Change data feed

生成列

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 Checkpoint Spec

清理协议检查

7

3

Vacuum Protocol Check Spec

行追踪

7

3

为Delta表使用行追踪

类型扩展(预览)

7

3

Delta type widening

提交中时间戳

7

3

In-Commit Timestamps Spec

升级协议版本

您可以选择手动将表更新到更新的协议版本。我们建议使用支持表所需Delta Lake功能的最低协议版本。升级写入器协议可能比升级读取器协议造成的干扰更小,因为使用旧版Delta Lake的系统和工作负载仍可读取表数据,即使它们不支持更新后的写入器协议。

警告

协议版本升级是不可逆的,升级协议版本可能会破坏现有的Delta Lake表读取器、写入器或两者。我们建议仅在需要时升级特定表,例如选择使用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.forName
delta.upgradeTableProtocol(1, 3) # upgrades to readerVersion=1, writerVersion=3
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.