Databricks 中的删除向量

删除向量可加速 Delta Lake 中的 DELETEUPDATEMERGE 操作。 如果没有删除向量,修改单个行需要重写包含该记录的整个 Parquet 文件。 删除向量则改为在元数据中将行标记为已修改,而读取时会在查询期间应用删除向量中的条目,以确定表的当前状态。

注释

对于预测 I/O 更新,Photon 使用删除矢量来加速DELETEMERGEUPDATE操作。 请参阅使用预测性 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 及更高版本中的 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 或更高版本。
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 请求。

若要以物理方式删除旧数据,

  1. REORG TABLE ... APPLY (PURGE)运行
  2. 运行 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)。
  • 如果您在具体化视图或流式表上启用了删除向量,并随后删除这些向量,那么删除向量将不适用于该视图或表的未来写入操作,但现有的删除向量会继续保留。
  • 即使随后关闭删除向量,在物化视图或流式表上启用删除向量后,也不能将表协议降级。