删除向量可加速 Delta Lake 中的 DELETE、UPDATE 和 MERGE 操作。 如果没有删除向量,修改单个行需要重写包含该记录的整个 Parquet 文件。 删除向量则改为在元数据中将行标记为已修改,而读取时会在查询期间应用删除向量中的条目,以确定表的当前状态。
注释
对于预测 I/O 更新,Photon 使用删除矢量来加速DELETE、MERGE和UPDATE操作。 请参阅使用预测性 I/O 加快更新速度。
Prerequisites
对于 Delta Lake 表,必须显式启用删除向量。
若要使用所有优化编写包含删除矢量的表,请使用 Databricks Runtime 14.3 LTS 及更高版本。 若要读取它们,请使用 Databricks Runtime 12.2 LTS 及更高版本。
在 Databricks Runtime 14.2 及更高版本中,包含删除矢量的表支持行级并发。 请参阅 行级并发。
客户端兼容性
Azure Databricks 使用删除向量为已启用 Photon 的计算更新提供预测 I/O 支持。 请参阅使用预测性 I/O 加快更新速度。
对读取和写入的删除向量的使用的支持因客户端而异。
下表列出了读取和写入删除向量表所需的客户端版本:
| Client | 写入删除向量 | 读取删除向量 |
|---|---|---|
| 带有 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 Apache Spark 搭配 OSS Delta Lake | 支持使用 OSS Delta 2.4.0 及更高版本的 DELETE。 支持 OSS Delta 3.0.0 及更高版本的 UPDATE。 |
需要 OSS Delta 2.3.0 或更高版本。 |
| OpenSharing 收件人 | OpenSharing 表不支持写入操作。 | Azure Databricks需要 Databricks Runtime 14.1 或更高版本。 开源 Apache Spark 需要 delta-sharing-spark 3.1 或更高版本。 |
有关其他客户端的支持,请参阅 OSS Delta Lake 集成文档。
启用删除向量
在工作区设置中,当使用 SQL 数据仓库或 Databricks Runtime 14.3 LTS 或更高版本时,可以在新表上启用删除向量。
在默认情况下,Hive 元存储中存储的物化视图和流式处理表不会启用删除向量。
若要在任何表或视图(包括流式处理表和具体化视图)上手动启用或禁用对删除向量的支持,请使用 enableDeletionVectors 表属性。 若要在创建或更改表时对表启用删除矢量,
Delta Lake
CREATE TABLE <table-name> [options] TBLPROPERTIES ('delta.enableDeletionVectors' = true);
ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.enableDeletionVectors' = true);
对数据文件应用软删除
删除向量将对行的更改标记为软删除,从而从逻辑上修改表中现有的 Parquet 数据文件。 若要以物理方式重写 Parquet 数据文件,请执行以下操作之一:
- 在表中运行
OPTIMIZE。 - 在表中运行
REORG TABLE ... APPLY (PURGE)。 此命令重写包含具有删除向量更改的记录的所有数据文件。 请参阅 REORG TABLE。 - 在启用自动压缩的情况下执行一次写入操作,这会触发对带有删除向量的数据文件的重写。
文件压缩事件没有严格的保证,无法解析在删除向量中记录的更改。 如果目标数据文件不是文件压缩的候选项,则删除向量中记录的某些更改可能不会以物理方式应用。
以物理方式删除旧数据
清除操作后,表的旧数据文件中仍可能存在已修改的数据。 例如,你可能想要以物理方式删除数据,以降低云提供商的存储成本或符合 GDPR 请求。
若要以物理方式删除旧数据,
-
REORG TABLE ... APPLY (PURGE)运行 - 运行
VACUUM,并将保留阈值设为清理完成时间戳,以从旧表版本中物理删除文件。 请参阅清除仅元数据删除以强制重写数据。
优化大型表的性能表现
若要提高对大型表执行清除操作的性能,请将 spark.databricks.delta.reorg.purgeMode 设置为 rows。
例如,在手动清除数据时使用REORG TABLE ... APPLY (PURGE),或在去除删除向量时使用ALTER TABLE DROP FEATURE deletionVectors设置此配置。
默认情况下,spark.databricks.delta.reorg.purgeMode 设置为 all。 在大型表中,此操作可能很慢,因为清除操作必须扫描所有 Parquet 文件页脚来检查已删除的列数据和软删除的行。
该值 rows 将操作限制为仅处理软删除行文件。 在大型表中,如果许多文件中没有软删除的行且表中没有被删除的列,则可能会提高性能。
Limitations
- 不能使用 GENERATE 语句 为包含删除向量文件的表生成清单文件。 若要生成清单,请先运行 REORG TABLE … APPLY (PURGE) 语句 ,然后运行
GENERATE语句。 在提交REORG语句时,必须验证没有并发写入操作正在运行。- 不能以增量方式为启用了删除矢量的表生成清单文件(例如,通过设置表属性
delta.compatibility.symlinkFormatManifest.enabled=true)。
- 不能以增量方式为启用了删除矢量的表生成清单文件(例如,通过设置表属性
- 如果您在具体化视图或流式表上启用了删除向量,并随后删除这些向量,那么删除向量将不适用于该视图或表的未来写入操作,但现有的删除向量会继续保留。
- 即使随后关闭删除向量,在物化视图或流式表上启用删除向量后,也不能将表协议降级。