Databricks 中的删除向量

删除向量是一项存储优化功能,可加速对表的修改。 默认情况下,删除单个行需要重写包含该记录的整个 Parquet 文件。 删除向量可避免这种开销。 启用删除向量时,DELETEUPDATEMERGE 操作会将行标记为已修改,而无需重写 Parquet 文件。 首先读取当前表状态,然后通过应用删除向量所记录的修改来解析该状态。

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

在 Databricks Runtime 14.2 及更高版本中,包含删除矢量的表支持行级并发。 请参阅 行级并发

注意

对于预测 I/O 更新,Photon 使用删除矢量来加速DELETEMERGEUPDATE操作。 请参阅使用预测性 I/O 加快更新速度

启用删除向量

在工作区设置中,当使用 SQL 数据仓库或 Databricks Runtime 14.3 LTS 或更高版本时,可以在新表上启用删除向量。

在默认情况下,Hive 元存储中存储的物化视图和流式处理表不会启用删除向量。

若要在任何表或视图(包括流式处理表和具体化视图)上手动启用或禁用对删除向量的支持,请使用 enableDeletionVectors 表属性。 若要在创建或更改表时对表启用删除矢量,

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

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

不能使用 ALTER 语句在具体化视图或流式处理表上启用或禁用删除向量。

对于 Iceberg 表,请使用 iceberg.enableDeletionVectors 而不是 delta.enableDeletionVectors

警告

启用删除向量时,Databricks 将升级表协议。 升级后,没有删除向量支持的客户端无法读取表。 请参阅 Delta Lake 功能兼容性和协议

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

将更改应用于 Parquet 数据文件

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

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

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

以物理方式删除旧数据

清除操作后,表的旧数据文件中仍可能存在已修改的数据。 例如,你可能想要以物理方式删除数据,以降低云提供商的存储成本或符合 GDPR 请求。

运行 VACUUM 以物理方式删除旧文件。 该 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 将操作限制为仅处理软删除行文件。 在大型表中,如果许多文件中没有软删除的行且表中没有被删除的列,则可能会提高性能。

客户端兼容性

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

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

下表显示了读取和写入启用了删除矢量的表所需的客户端版本,并指定哪些写入操作使用删除向量:

客户端 写入删除向量 读取删除向量
带有 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 Apache Spark 和 OSS Delta Lake 支持使用 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 表上启用删除向量后,无法降级表协议。 启用后,无法删除删除向量的表特征,即使您随后在视图或表上禁用了删除向量也是如此。