Delta Lake如何管理功能兼容性?
许多Delta Lake优化功能需要在表上启用Delta Lake特性。Delta Lake特性始终保持向后兼容性,因此较低版本Delta Lake写入的表始终可以被较高版本Delta Lake读取和写入。启用某些特性会破坏与运行在较低Delta Lake版本中的工作负载的前向兼容性。对于破坏前向兼容性的特性,您必须将所有引用升级表的工作负载更新为使用兼容的Delta Lake版本。
Delta Lake 哪些功能需要客户端升级?
以下Delta Lake特性会破坏向前兼容性。这些特性是按表逐个启用的。
功能 |
需要Delta Lake版本或更高 |
文档 |
|---|---|---|
|
||
生成列 |
||
列映射 |
||
变更数据订阅 |
||
删除向量 |
||
表格特性 |
||
不带时区的时间戳 |
||
Iceberg兼容性V1 |
||
Iceberg兼容性V2 |
||
V2检查点 |
||
领域元数据 |
||
聚类 |
||
行追踪 |
||
类型扩展(预览版) |
||
标识列 |
||
提交内时间戳 |
什么是表协议规范?
每个Delta表都有一个协议规范,用于说明该表支持的功能集。读取或写入表的应用程序会使用协议规范来确定它们是否能处理表支持的所有功能。如果某个应用程序不知道如何处理表中协议列出的某个支持功能,则该应用程序将无法读取或写入该表。
协议规范分为两个组成部分:读取协议和写入协议。
哪些协议必须升级?
某些功能需要同时升级读取协议和写入协议。其他功能则只需要升级写入协议。
例如,对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功能所需的最低协议版本。
功能 |
|
|
文档 |
|---|---|---|---|
基础功能 |
2 |
1 |
|
|
3 |
1 |
|
变更数据馈送 |
4 |
1 |
|
生成列 |
4 |
1 |
|
列映射 |
5 |
2 |
|
标识列 |
6 |
1 |
|
读取的表特性 |
7 |
1 |
|
表格特性写入 |
7 |
3 |
|
删除向量 |
7 |
3 |
|
不带时区的时间戳 |
7 |
3 |
|
Iceberg兼容性V1 |
7 |
2 |
|
V2检查点 |
7 |
3 |
|
清理协议检查 |
7 |
3 |
|
行追踪 |
7 |
3 |
|
类型扩展(预览) |
7 |
3 |
|
提交中时间戳 |
7 |
3 |
升级协议版本
您可以选择手动将表更新到更新的协议版本。我们建议使用支持表所需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.