在 Databricks Runtime 16.4 LTS 及更高版本中, DROP FEATURE 删除 Delta Lake 表功能,并将表协议降级到支持剩余功能的最低版本。 仅使用此函数还原与早期 Databricks Runtime 版本、OpenSharing 或外部 Delta Lake 客户端的兼容性。
并非所有功能都可以删除。 请参阅 支持的表功能。
Note
从 Databricks Runtime 14.3 LTS 开始,提供对 DROP FEATURE 的遗留支持。 Databricks 建议对所有 DROP FEATURE 命令使用 Databricks Runtime 16.3 及更高版本,以替换旧行为。 有关旧功能的文档,请参阅 删除 Delta 表功能(旧版)。
删除 Delta Lake 功能
必须使用 Databricks Runtime 16.3 或更高版本,并且对目标 Delta Lake 表具有 MODIFY 特权。 你只能在每个DROP FEATURE命令中删除一个表特性。
若要删除表功能,请使用以下语法:
ALTER TABLE <table-name> DROP FEATURE <feature-name>
有关详细信息,请参阅 ALTER TABLE。
Behavior
删除某个表功能时,Delta Lake 会以原子方式向该表提交以下更改:
- 关闭使用表格功能的表格属性。
- 根据需要重写基础数据文件,以从当前表版本中删除表功能的所有跟踪。
- 创建一组受保护的检查点,允许读取器客户端正确读取表历史记录。
- 将编写器表功能
checkpointProtection添加到表协议。 - 将表协议降级到支持所有剩余表功能的最低读取器和编写器版本。 请参阅 可能的最低协议。
checkpointProtection表功能
删除某个功能时,Delta Lake 会将表历史记录中的数据和元数据重写为受保护的检查点,以尊重协议降级。
降级后,表不需要客户端支持已删除的功能。 受保护的检查点和 checkpointProtection 功能可实现以下目的:
- 支持已删除表功能的读取器客户端可以读取所有可用的表历史记录版本。
- 不支持已删除功能的读取器客户端可以从协议降级版本向前读取表历史记录版本。
- 编写器客户端不会修改在协议降级之前创建的检查点。
-
checkpointProtection将协议降级检查点标记为受保护,表维护操作遵循这些标记。
虽然每条DROP FEATURE命令只能删除一个表功能,但在其表历史记录中,表可以包含多个受保护的检查点和被删除的功能。
所有 Databricks Runtime 版本都支持checkpointProtection表功能,这意味着此表功能不会阻止对Azure Databricks进行读取或写入。
checkpointProtection 不会阻止 OSS Delta Lake 客户端的只读访问。 要想彻底降低表格等级并移除checkpointProtection表格特性,您必须使用TRUNCATE HISTORY。 Databricks 建议仅在您需要通过不支持 checkpointProtection 的外部 Delta 客户端向表写入数据时使用此模式。 请参阅 旧客户端的完整降级表协议。
支持的表格功能
可以删除以下 Delta Lake 表功能:
-
catalogManaged。 请参阅 目录提交。 -
checkConstraints。 请参阅 Azure Databricks 上的限制条件。 -
collations-preview。 请参阅 Delta Lake 的排序规则支持。 -
columnMapping。 请参阅 有关使用 Delta Lake 列映射重命名和删除列的说明。 -
deletionVectors。 请参阅 Databricks 中的删除向量。 -
typeWidening。 请参阅类型扩展。 -
v2Checkpoint。 请参阅 降级到经典。 -
checkpointProtection。 请参阅表格checkpointProtection功能。
不能删除其他 Delta Lake 表功能。
重要
Databricks 建议在启用升级生产数据的读取器或编写器协议的功能之前,始终测试依赖的工作负载和系统,以便与新功能兼容。
考虑以下情况:
- 从表中删除列映射不会删除分区表的目录名称中使用的随机前缀。 请参阅 Delta Lake 和 Parquet 是否共享分区策略?。
- 某些 Delta Lake 功能支持多个相互依赖的表功能,这可能会阻止删除依赖性功能。 无法回滚无法删除的功能。
旧客户端的完全降级表协议
如果你使用外部 Delta Lake 客户端进行写入,而这些写入不支持 checkpointProtection 表功能,则必须使用 TRUNCATE HISTORY 来完全降级表协议,并移除已删除表功能的所有痕迹。 运行 TRUNCATE HISTORY 会删除超过 24 小时的所有表历史记录。
Databricks 建议先测试 DROP FEATURE 的默认行为,再运行 TRUNCATE HISTORY。
完全降级需要分两步进行,且两步之间至少间隔 24 小时。
步骤 1:准备删除一个表格对象
运行 ALTER TABLE <table-name> DROP FEATURE <feature-name> TRUNCATE HISTORY 命令。 该命令应用以下内容:
- 更新表属性以关闭该功能。
- 将该功能的关联表属性重置为其默认值。
- 根据需要重写数据和元数据文件以反映更新的属性。
- 返回一条消息,要求你至少等待 24 小时,然后再再次运行以完成协议降级。
关闭功能后,可以在完成协议降级之前继续写入目标表,但无法使用要删除的表功能。
Note
如果使表处于此状态,则针对表的操作不使用表功能,但协议仍支持表功能。 在完成最后的降级步骤之前,不支持该表功能的 Delta 客户端无法读取该表。
步骤 2:降级协议并删除表功能
至少 24 小时后,再次运行 ALTER TABLE <table-name> DROP FEATURE <feature-name> TRUNCATE HISTORY 该命令。 该命令应用以下内容:
- 将表历史记录截断至保留阈值。
- 确认没有剩余事务使用此功能。
- 删除该功能并将表协议降级到支持剩余功能的最低版本。
重要
运行 ALTER TABLE <table-name> DROP FEATURE <feature-name> TRUNCATE HISTORY 将删除所有超过 24 小时的事务日志数据。 使用此命令将表协议降级后,将无法访问表历史记录或进行时间回溯。
请参阅 Delta Lake 功能兼容性和协议。