什么是删除向量?
删除向量是可在 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 或更高版本创建新表时,默认情况下会启用删除向量。 创建具体化视图或流式处理表时,默认情况下不会启用删除向量,并且必须在创建具体化视图或流式处理表时手动启用。
若要手动启用对表或视图上的删除向量的支持,请使用 delta.enableDeletionVectors
表属性。 创建或更改表时,可以在 Delta 表上手动启用删除向量。 只有在创建具体化视图或流式处理表时,才能在具体化视图或流式处理表上手动启用删除向量。 不能使用 ALTER
语句在具体化视图或流式处理表上启用删除向量。
CREATE TABLE <table-name> [options] TBLPROPERTIES ('delta.enableDeletionVectors' = true);
ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.enableDeletionVectors' = true);
警告
启用删除向量时,表协议会升级。 升级后,不支持删除向量的 Delta Lake 客户端无法读取该表。 请参阅 Azure Databricks 如何管理 Delta Lake 功能兼容性?。
在 Databricks Runtime 14.1 及更高版本中,你可以将删除向量表功能删除以实现与其他 Delta 客户端的兼容性。 请参阅删除 Delta 表功能。
将更改应用于 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
)。 - 如果在具体化视图或流式处理表上启用删除向量,随后禁用删除向量,则会阻止将来对视图或表的写入使用删除向量,但不会删除现有删除向量。
- 在具体化视图或流式处理表上启用删除向量后,无法降级表协议。 启用后,即使随后在视图或表上禁用删除向量,也无法删除删除向量的表功能。
- 不能
REORG
在具体化视图或流式处理表上运行,以将删除向量中记录的更改提交到支持这些对象的 Parquet 数据文件。 由于此限制,如果必须保证完全删除记录(例如,对于 GDPR 或 CCPA 合规性),请不要对具体化视图或流式处理表启用删除向量。