跳到内容

删除 Delta 表功能

本文介绍如何删除 Delta Lake 表特性并降级协议版本。

您应该仅在需要支持与早期 Delta Lake 版本、Delta Sharing 或其他 Delta Lake 读取器或写入器客户端的兼容性时才使用此功能。

要删除 Delta 表特性,请运行 ALTER TABLE <table-name> DROP FEATURE <feature-name> 命令。

您可以删除以下 Delta 表特性

  • deletionVectors。参见什么是删除向量?。删除向量的支持在 Delta Lake 4.0.0 及更高版本中可用。
  • typeWidening-preview。参见Delta 类型扩展。类型扩展在 Delta Lake 3.2.0 及更高版本中可用。
  • typeWidening。参见Delta 类型扩展。类型扩展在 Delta Lake 4.0.0 及更高版本中可用。
  • v2Checkpoint。参见V2 检查点规范。删除 V2 检查点的支持在 Delta Lake 3.1.0 及更高版本中可用。
  • columnMapping。参见Delta 列映射。删除列映射的支持在 Delta Lake 3.3.0 及更高版本中可用。
  • vacuumProtocolCheck。参见Vacuum 协议检查规范。删除 vacuum 协议检查的支持在 Delta Lake 3.3.0 及更高版本中可用。
  • checkConstraints。参见约束。删除检查约束的支持在 Delta Lake 3.3.0 及更高版本中可用。
  • inCommitTimestamp。参见提交内时间戳。删除提交内时间戳的支持在 Delta Lake 3.3.0 及更高版本中可用。
  • checkpointProtection。参见检查点保护规范。删除检查点保护的支持在 Delta Lake 4.0.0 及更高版本中可用。

您不能删除其他Delta 表特性

当您删除表特性时,Delta Lake 执行一系列原子操作

  • 禁用使用该表特性的表属性。
  • 根据需要重写数据文件,以从当前版本中表数据文件支持的表中删除所有表特性的痕迹。
  • 创建一组受保护的检查点,允许读取客户端正确解释表历史。
  • 将写入器表特性 checkpointProtection 添加到表协议。
  • 将表协议降级到支持所有剩余表特性的最低读取器和写入器版本。

当您删除某个特性时,Delta Lake 会将表历史记录中的数据和元数据重写为受保护的检查点,以遵守协议降级。降级后,表应该始终可以被更多客户端读取。这是因为表的协议现在反映了不再需要支持已删除的特性来读取表。受保护的检查点和 checkpointProtection 特性实现了以下目标

  • 了解已删除表特性的读取客户端可以访问所有可用的表历史记录。
  • 不支持已删除表特性的读取客户端只需从协议降级版本开始读取表历史记录。
  • 写入客户端不会重写协议降级之前的检查点。
  • 表维护操作遵守 checkpointProtection 设定的要求,该特性将协议降级检查点标记为受保护。
  • 尽管您每次只能使用一个 DROP FEATURE 命令删除一个表特性,但表在其历史记录中可以有多个受保护的检查点和已删除的特性。

表特性 checkpointProtection 不应阻止 Delta Lake 客户端的只读访问。要完全降级表并删除 checkpointProtection 表特性,您必须使用 TRUNCATE HISTORY。建议仅在您需要使用不支持 checkpointProtection 的外部 Delta 客户端写入表时才使用此模式。

如果与外部 Delta Lake 客户端的集成需要不支持 checkpointProtection 表特性的写入,您必须使用 TRUNCATE HISTORY 来完全删除已禁用表特性的所有痕迹并完全降级表协议。

在执行 TRUNCATE HISTORY 之前,始终建议测试 DROP FEATURE 的默认行为。运行 TRUNCATE HISTORY 会删除超过 24 小时内的所有表历史记录。

完整的表降级分两步进行,并且必须至少间隔 24 小时。

在第一阶段,用户准备删除表特性。以下描述了在此阶段发生的情况

  1. 您运行 ALTER TABLE <table-name> DROP FEATURE <feature-name> TRUNCATE HISTORY 命令。
  2. 明确启用表特性的表属性的值被设置为禁用该特性。
  3. 控制与已删除特性相关的行为的表属性的选项设置为该特性引入之前的默认值。
  4. 根据需要,重写数据和元数据文件,以遵守更新的表属性。
  5. 命令运行完成并返回错误消息,通知用户必须等待 24 小时才能继续删除特性。

首次禁用特性后,您可以在完成协议降级之前继续写入目标表,但您不能使用正在删除的表特性。

要完全删除与该特性相关的所有事务历史记录并降级协议

  1. 至少 24 小时后,您运行 ALTER TABLE <table-name> DROP FEATURE <feature-name> TRUNCATE HISTORY 命令。
  2. 客户端确认指定保留阈值内的所有事务均未使用该表特性,然后将表历史记录截断至该阈值。
  3. 协议降级,删除表特性。
  4. 如果表中存在的表特性可以由旧版协议版本表示,则表的 minReaderVersionminWriterVersion 会降级到支持 Delta 表中所有剩余特性的最低版本。

请参阅Delta Lake 如何管理特性兼容性?