什么是删除向量?

删除向量是在 Delta Lake tables上启用的存储优化功能。 默认情况下,当删除数据文件中的单个行时,必须重写包含该记录的整个 Parquet 文件。 为 table启用删除向量后,DELETEUPDATEMERGE 操作使用删除向量将现有行标记为已删除或更改,而无需重写 Parquet 文件。 对表的后续读取通过将删除向量指示的删除应用于最新的表版本来解析当前表状态。

Databricks 建议使用 Databricks Runtime 14.3 LTS 及更高版本编写包含删除向量的表,以利用所有优化。 可以在 Databricks Runtime 12.2 LTS 及更高版本中读取启用了删除矢量的表。

在 Databricks Runtime 14.2 及更高版本中,tables 的删除向量功能支持行级并发。 查看使用行级别并发写入冲突

注意

Photon 利用删除向量进行预测性 I/O 更新,加速 DELETEMERGEUPDATE 操作。 所有支持读取删除向量的客户端都可以读取生成了删除向量的更新,无论预测性 I/O 是否产生了这些更新。 请参阅使用预测性 I/O 加快更新速度

启用删除向量

重要

工作区管理设置控制是否为新的增量表自动启用删除向量。 请参阅自动启用删除向量

如果使用用于控制自动启用删除向量的工作区设置,则根据为表类型选择的选项,使用 SQL 仓库或 Databricks Runtime 14.1 或更高版本创建新表时,默认将启用删除向量。 在创建具体化视图或流式处理表时,默认不会启用删除向量,并且在创建具体化视图或流式处理表时必须手动启用删除向量。

若要在 table 或视图中手动启用对删除向量的支持,请使用 delta.enableDeletionVectorstable 属性。 创建或更改表时,可以在增量表上手动启用删除向量。 只有在创建具体化视图或流式处理表时,才能在具体化视图或流式处理表上手动启用删除向量。 不能使用 ALTER 语句在具体化视图或流式处理表上启用删除向量。

CREATE TABLE <table-name> [options] TBLPROPERTIES ('delta.enableDeletionVectors' = true);

ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.enableDeletionVectors' = true);

警告

启用删除向量时,将升级 table 协议。 升级后,不支持删除矢量的 Delta Lake 客户端将无法读取 table。 请参阅 Azure Databricks 如何管理 Delta Lake 功能兼容性?

在 Databricks Runtime 14.1 及更高版本中,可以删除向量 table 功能以实现与其他 Delta 客户端的兼容性。 请参阅删除增量表功能

将更改应用于 Parquet 数据文件

删除向量将行的更改指示为软删除,这种删除将以逻辑方式修改 Delta Lake 表中现有的 Parquet 数据文件。 当以下事件之一导致数据文件被重写时,这些更改将以物理方式应用:

  • table上运行 OPTIMIZE 命令。
  • 自动压缩会触发使用删除向量重写数据文件的操作。
  • 对表运行 REORG TABLE ... APPLY (PURGE)

与文件压缩相关的事件不能严格保证会解析删除向量中记录的更改,如果目标数据文件不是文件压缩的候选项,则可能不会应用删除向量中记录的某些更改。 REORG TABLE ... APPLY (PURGE) 重写所有包含记录以及使用删除向量记录的修改的数据文件。 请参阅 REORG TABLE

注意

修改的数据可能仍然存在于旧文件中。 可以运行 VACUUM 以物理方式删除旧文件。 REORG TABLE ... APPLY (PURGE) 完成后会创建一个 table 的新版本。 此完成时间是你必须考虑的 VACUUM 操作保留阈值的时间戳,以便完全移除已删除的文件。 请参阅使用 vacuum 移除未使用的数据文件

与 Delta 客户端的兼容性

Azure Databricks 使用删除向量为已启用 Photon 的计算更新提供预测 I/O 支持。 请参阅使用预测性 I/O 加快更新速度

对读取和写入的删除向量的使用的支持因客户端而异。

以下 table 表示在启用删除向量的情况下读取和写入 Delta tables 所需的客户端版本,并指定哪些写入操作使用删除向量:

客户端 写入删除向量 读取删除向量
带有 Photon 的 Databricks Runtime 支持使用 Databricks Runtime 12.2 LTS 及更高版本的 MERGEUPDATEDELETE 需要 Databricks Runtime 12.2 LTS 或更高版本。
没有 Photon 的 Databricks Runtime 支持使用 Databricks Runtime 12.2 LTS 及更高版本的 DELETE。 支持运行 Databricks Runtime 14.1 及更高版本的 UPDATE。 支持使用 Databricks Runtime 14.3 LTS 及更高版本运行 MERGE 需要 Databricks Runtime 12.2 LTS 或更高版本。
搭配使用 OSS Delta Lake 和 OSS Apache Spark 支持使用 OSS Delta 2.4.0 及更高版本的 DELETE。 支持使用 OSS Delta 3.0.0 及更高版本的 UPDATE 需要 OSS Delta 2.3.0 或更高版本。
Delta Sharing 接收方 Delta Sharing 表不支持写操作 Databricks:需要 DBR 14.1 或更高版本。 开源 Apache Spark:需要 delta-sharing-spark 3.1 或更高版本。

注意

有关其他 Delta 客户端的支持,请参阅 OSS Delta Lake 集成文档

限制

  • UniForm 不支持删除向量。
  • 不能使用 GENERATE 语句为包含文件且使用删除向量的表生成清单文件。 若要生成清单,请先运行 REORG TABLE … APPLY (PURGE) 语句,然后运行 GENERATE 语句。 必须确保在提交 REORG 语句时没有并发写入操作正在运行。
  • 不能为启用了删除矢量的表增量生成清单文件(例如,通过设置表属性 delta.compatibility.symlinkFormatManifest.enabled=true)。
  • 如果在物化视图或流式处理 table 上启用删除向量,然后禁用删除向量,则未来的写入操作将无法在视图或 table 上使用删除向量,但现有的删除向量不会被移除。
  • 在具体化视图或流式处理表上启用删除向量后,无法降级表协议。 启用后,即使随后在视图或 table中禁用删除向量,也无法移除 table 的删除向量功能。
  • 不能对具体化视图或流式处理表运行 REORG,以将删除向量中记录的更改提交到支持这些对象的 Parquet 数据文件。 由于此限制,如果必须保证记录的完全删除(例如为满足 GDPR 或 CCPA 的合规性要求),请不要在具体化的 views 或流式传输的 tables 上启用删除向量。