删除矢量是可以在 Delta Lake 表中启用的存储优化功能。 默认情况下,当删除数据文件中的单个行时,必须重写包含该记录的整个 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 加快更新速度。
启用删除向量
重要
工作区管理设置控制是否为新的 Delta 表自动启用删除向量。
如果使用用于控制自动启用删除向量的工作区设置,则使用 SQL 仓库或 Databricks Runtime 14.1 或更高版本创建新表时,默认情况下会启用删除向量,具体取决于为表类型选择的选项。
注意
在默认情况下,Hive 元存储中存储的物化视图和流式处理表不会启用删除向量。
若要在任何 Delta 表或视图(包括流式处理表和具体化视图)上手动启用或禁用对删除向量的支持,请使用 delta.enableDeletionVectors 表属性。 可以在创建或更改表时手动选择是否在 Delta 表上启用删除向量,如以下示例所示。 不能使用 ALTER 语句在具体化视图或流式处理表上启用或禁用删除向量。
CREATE TABLE <table-name> [options] TBLPROPERTIES ('delta.enableDeletionVectors' = true);
ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.enableDeletionVectors' = true);
警告
启用删除向量时,表协议会升级。 升级后,不支持删除向量的 Delta Lake 客户端无法读取该表。 请参阅 Delta Lake 功能兼容性和协议。
在 Databricks Runtime 14.1 及更高版本中,你可以将删除向量表功能删除以实现与其他 Delta 客户端的兼容性。 请参阅删除 Delta Lake 表功能并降级表协议。
将更改应用于 Parquet 数据文件
删除向量将行的更改指示为软删除,这种删除将以逻辑方式修改 Delta Lake 表中现有的 Parquet 数据文件。 当以下事件之一导致数据文件被重写时,这些更改将以物理方式应用:
- 对表运行
OPTIMIZE命令。 - 自动压缩会触发使用删除向量重写数据文件的操作。
- 对表运行
REORG TABLE ... APPLY (PURGE)。
与文件压缩相关的事件不能严格保证会解析删除向量中记录的更改,如果目标数据文件不是文件压缩的候选项,则可能不会应用删除向量中记录的某些更改。
REORG TABLE ... APPLY (PURGE) 重写所有包含记录以及使用删除向量记录的修改的数据文件。 请参阅 REORG TABLE。
注意
修改的数据可能仍然存在于旧文件中。 可以运行 VACUUM 以物理方式删除旧文件。
REORG TABLE ... APPLY (PURGE) 在表完成时创建新版本的表。 此完成时间是您在进行 VACUUM 操作时必须考虑的时间戳,以确定完全删除已删除文件的保留阈值。 请参阅使用 vacuum 删除未使用的数据文件。
与 Delta 客户端的兼容性
Azure Databricks 使用删除向量为已启用 Photon 的计算更新提供预测 I/O 支持。 请参阅使用预测性 I/O 加快更新速度。
对读取和写入的删除向量的使用的支持因客户端而异。
下表表示读取和写入启用了删除矢量的 Delta 表所需的客户端版本,并指定哪些写入作使用删除向量:
| 客户端 | 写入删除向量 | 读取删除向量 |
|---|---|---|
| 带有 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 共享收件人 | 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)。