删除向量是一项存储优化功能,可加速对表的修改。 默认情况下,删除单个行需要重写包含该记录的整个 Parquet 文件。 删除向量可避免这种开销。 启用删除向量时,DELETE、UPDATE 和 MERGE 操作会将行标记为已修改,而无需重写 Parquet 文件。 首先读取当前表状态,然后通过应用删除向量所记录的修改来解析该状态。
Databricks 建议使用 Databricks Runtime 14.3 LTS 及更高版本编写包含删除矢量的表,以使用所有优化。 可以在 Databricks Runtime 12.2 LTS 及更高版本中读取启用了删除矢量的表。
在 Databricks Runtime 14.2 及更高版本中,包含删除矢量的表支持行级并发。 查看使用行级别并发写入冲突。
注意
Photon 利用删除向量进行预测性 I/O 更新,加速 DELETE、MERGE 和 UPDATE 操作。 所有支持读取删除向量的客户端都可以读取生成了删除向量的更新,无论预测性 I/O 是否产生了这些更新。 请参阅使用预测性 I/O 加快更新速度。
启用删除向量
重要
工作区管理员的设置选项用于控制是否为新表自动启用删除向量。
如果使用用于控制自动启用删除向量的工作区设置,则使用 SQL 仓库或 Databricks Runtime 14.1 或更高版本创建新表时,默认情况下会启用删除向量,具体取决于为表类型选择的选项。
注意
在默认情况下,Hive 元存储中存储的物化视图和流式处理表不会启用删除向量。
若要在任何表或视图(包括流式处理表和具体化视图)上手动启用或禁用对删除向量的支持,请使用 enableDeletionVectors 表属性。 手动选择在创建或更改表时是否对表启用删除向量,如以下示例所示。 不能使用 ALTER 语句在物化视图或流式处理表上启用或禁用删除向量。
-- For Delta tables
CREATE TABLE <table-name> [options] TBLPROPERTIES ('delta.enableDeletionVectors' = true);
ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.enableDeletionVectors' = true);
-- For Iceberg tables, use iceberg.enableDeletionVectors instead of delta.enableDeletionVectors
警告
启用删除向量时,表协议会升级。 升级后,不支持删除向量的客户端将无法读取该表。 请参阅 Delta Lake 功能兼容性和协议。
在 Databricks Runtime 14.1 及更高版本中,可以删除向量表功能以实现与其他客户端的兼容性。 请参阅删除 Delta Lake 表功能并降级表协议。
将更改应用于 Parquet 数据文件
删除向量用于指示在逻辑上以软删除方式修改表中现有 Parquet 数据文件时对行所做的更改。 当以下事件之一导致数据文件被重写时,这些更改将以物理方式应用:
- 对表运行
OPTIMIZE命令。 - 自动压缩会触发使用删除向量重写数据文件的操作。
- 对表运行
REORG TABLE ... APPLY (PURGE)。
与文件压缩相关的事件不能严格保证会解析删除向量中记录的更改,如果目标数据文件不是文件压缩的候选项,则可能不会应用删除向量中记录的某些更改。
REORG TABLE ... APPLY (PURGE) 重写所有包含记录以及使用删除向量记录的修改的数据文件。 请参阅 REORG TABLE。
注意
修改的数据可能仍然存在于旧文件中。 可以运行 VACUUM 以物理方式删除旧文件。
REORG TABLE ... APPLY (PURGE) 在表完成时创建新版本的表。 此完成时间是您在进行 VACUUM 操作时必须考虑的时间戳,以确定完全删除已删除文件的保留阈值。 请参阅使用 vacuum 删除未使用的数据文件。
客户端兼容性
Azure Databricks 使用删除向量为已启用 Photon 的计算更新提供预测 I/O 支持。 请参阅使用预测性 I/O 加快更新速度。
对读取和写入的删除向量的使用的支持因客户端而异。
下表显示了启用删除向量时读取和写入表所需的客户端版本,并指明哪些写入操作会使用删除向量:
| 客户端 | 写入删除向量 | 读取删除向量 |
|---|---|---|
| 带有 Photon 的 Databricks Runtime | 支持使用 Databricks Runtime 12.2 LTS 及更高版本的 MERGE、UPDATE 和 DELETE。 |
需要 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 共享收件人 | 增量共享表不支持写入。 | Databricks:需要 Databricks Runtime 14.1 或更高版本。 开源 Apache Spark:需要 delta-sharing-spark 3.1 或更高版本。 |
注意
有关其他客户端的支持,请参阅 OSS Delta Lake 集成文档。
限制
- UniForm Iceberg v2 不支持删除向量。 Apache Iceberg v3 支持启用了 UniForm 的表上的删除向量。 请参阅 使用 Apache Iceberg v3 功能。
- 不能使用 GENERATE 语句 为包含删除向量文件的表生成清单文件。 若要生成清单,请先运行 REORG TABLE … APPLY (PURGE) 语句 ,然后运行
GENERATE语句。 必须确保在提交REORG语句时没有并发写入操作正在运行。 - 不能以增量方式为启用了删除矢量的表生成清单文件(例如,通过设置表属性
delta.compatibility.symlinkFormatManifest.enabled=true)。 - 如果在具体化视图或 Streaming 表上启用删除向量,然后禁用删除向量,则会阻止将来对视图或表的写入使用删除向量,但不会删除现有删除向量。
- 在物化视图或 Streaming 表上启用删除向量后,无法降级表协议。 启用后,无法删除删除向量的表特征,即使您随后在视图或表上禁用了删除向量也是如此。