取消 Delta Lake 表的某项功能并降级表协议

本文介绍如何删除 Delta Lake 表功能和降级协议版本。

此功能在 Databricks Runtime 16.3 及更高版本中可用。 并非所有 Delta 表功能都可以删除。 请参阅可以删除哪些 Delta 表功能?

仅使用 DROP FEATURE 来支持与早期 Databricks 运行时版本、Delta Sharing 或外部 Delta Lake 读取器或编写器客户端的兼容性。

注意

从 Databricks Runtime 14.3 LTS 开始,提供对 DROP FEATURE 的遗留支持。 Databricks 建议对所有 DROP FEATURE 命令使用 Databricks Runtime 16.3 及更高版本,以替换旧行为。 有关旧功能的文档,请参阅 删除 Delta 表功能(旧版)。

删除 Delta Lake 功能

若要删除表功能,请使用以下语法:

ALTER TABLE <table-name> DROP FEATURE <feature-name>

必须使用 Databricks Runtime 16.3 或更高版本,并且具有 MODIFY 目标 Delta 表的权限。 你只能在每个DROP FEATURE命令中删除一个表特性。

有关详细信息,请参阅 ALTER TABLE

重要

所有 DROP FEATURE 操作与所有并发写入发生冲突。

流式读取在遇到一个更改表元数据的提交时会失败。 如果你希望流继续进行,必须重启它。 有关建议的方法,请参阅结构化流式处理的生产注意事项

删除表功能时会发生什么情况?

删除表中的功能时,Delta Lake 会以原子方式提交对表的更改,以完成以下任务:

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

什么是 checkpointProtection 表格功能?

删除某个功能时,Delta Lake 会将表历史记录中的数据和元数据重写为受保护的检查点,以尊重协议降级。 降级后,表应始终可供更多读取器客户端读取。 这是因为表的协议现在显示要读取表时不再需要支持已删除的功能。 受保护的检查点和 checkpointProtection 功能可实现以下目的:

  • 了解已删除表功能的读取器客户端可以访问所有可用的表历史记录。
  • 不支持已删除表功能的读取器客户端只需从协议降级版本开始读取表历史记录。
  • 编写器客户端不会在协议降级之前重写检查点。
  • 表维护操作遵循checkpointProtection设定的要求,这些要求将协议降级检查点标记为受保护。

虽然每条DROP FEATURE命令只能删除一个表功能,但在其表历史记录中,表可以包含多个受保护的检查点和被删除的功能。

所有 Databricks Runtime 版本都支持 checkpointProtection 表功能,这意味着此表功能不会阻止 Azure Databricks 上的读取或写入。

表功能 checkpointProtection 不应阻止来自 OSS Delta Lake 客户端的只读访问。 要想彻底降低表格等级并移除checkpointProtection表格特性,您必须使用TRUNCATE HISTORY。 如果需要写入外部 Delta 客户端不支持 checkpointProtection的表,Databricks 建议仅使用此模式。 请参阅 旧客户端的完整降级表协议

可以删除哪些 Delta 表功能?

可以删除以下 Delta 表功能:

不能删除其他 Delta 表功能

重要

从表中删除列映射不会删除分区表的目录名称中使用的随机前缀。 请参阅 Delta Lake 和 Parquet 是否共享分区策略?

某些 Delta Lake 功能支持多个表格功能。 某些表功能依赖于其他表功能,并可能会阻止删除依赖表功能。 由于某些表功能无法删除,这意味着某些 Delta Lake 功能的启用设置无法回退。

Databricks 建议始终测试依赖的工作负载和系统,以便与新功能兼容,然后再启用升级生产数据的读取器或编写器协议的功能。

旧客户端的完全降级表协议

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

Databricks 建议先测试 DROP FEATURE 的默认行为,然后再继续进行 TRUNCATE HISTORY。 运行 TRUNCATE HISTORY 会删除大于 24 小时的所有表历史记录。

表格的完整降级分为两个步骤进行,这两个步骤必须至少间隔 24 小时。

步骤 1:准备删除一个表格对象

在第一阶段,用户准备删除表功能。 下面描述这个阶段发生的事情:

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

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

注意

如果将表保留在此状态,则针对表的操作不会使用表功能,但协议仍然支持表功能。 在完成最后的降级步骤之前,不了解表功能的 Delta 客户端无法读取该表。

步骤 2:降级协议并删除表功能

若要完全删除与该功能关联的所有事务历史记录,并降级协议:

  1. 至少经过 24 小时后,运行该命令 ALTER TABLE <table-name> DROP FEATURE <feature-name> TRUNCATE HISTORY
  2. 客户端确认在指定的保留期阈值内没有事务使用表功能,然后将表历史记录截断到该阈值处。
  3. 表功能在协议降级期间被删除。
  4. 如果表中的功能可以由较低版本的协议表示,那么表的 minReaderVersionminWriterVersion 将被降级到支持 Delta 表正在使用的其余功能的最低协议版本。

重要

运行 ALTER TABLE <table-name> DROP FEATURE <feature-name> TRUNCATE HISTORY 将删除所有超过 24 小时的事务日志数据。 使用此命令降级表协议后,您无法访问表历史记录或回溯功能。

请参阅 Delta Lake 功能兼容性和协议