什么是删除向量?

注意

此功能在Delta Lake 2.3.0及以上版本中可用。该功能目前处于实验性支持模式,带有_

删除向量是Delta Lake表上可启用的一项存储优化功能。默认情况下,当数据文件中的单行记录被删除时,必须重写包含该记录的整个Parquet文件。若为表启用了删除向量功能,某些Delta操作会使用删除向量来标记现有行已删除,而无需重写Parquet文件。后续对表的读取操作会通过将删除向量标注的删除操作应用到最新表版本来解析当前表状态。

对删除向量的支持是随着每个Delta Lake版本逐步添加的。下表展示了每个Delta Lake版本支持的操作。

操作

首次支持的Delta Lake版本

默认启用的Delta Lake版本

SCAN

2.3.0

2.3.0

DELETE

2.4.0

2.4.0

UPDATE

3.0.0

3.1.0

MERGE

3.1.0

3.1.0

启用删除向量

您可以通过设置Delta Lake表属性来启用对删除向量的支持:

ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableDeletionVectors' = true);

警告

当您启用删除向量时,表的协议版本会升级。升级后,不支持删除向量的Delta Lake客户端将无法读取该表。请参阅Delta Lake如何管理功能兼容性?

在Delta Lake 3.0及以上版本中,您可以禁用删除向量表功能以实现与其他Delta客户端的兼容性。请参阅Drop Delta table features

对Parquet数据文件应用变更

删除向量将行变更标记为逻辑上修改Delta Lake表中现有Parquet数据文件的软删除。当数据文件被重写时(由以下任一事件触发),这些变更会被物理应用:

  • 在表上运行了一个禁用删除向量的DML命令(通过命令标志或表属性)。

  • 在表上运行了一个OPTIMIZE命令。

  • REORG TABLE ... APPLY (PURGE) 是针对该表运行的。

UPDATEMERGEOPTIMIZE操作不能严格保证解析删除向量中记录的所有变更,如果目标数据文件不包含更新的记录,或者不符合文件压缩条件,则删除向量中记录的某些变更可能不会被应用。REORG TABLE ... APPLY (PURGE)会重写所有包含通过删除向量记录修改的数据文件。详见Apply changes with REORG TABLE

注意

修改后的数据可能仍存在于旧文件中。您可以运行VACUUM来物理删除旧文件。REORG TABLE ... APPLY (PURGE)会在完成时创建表的新版本,这个时间戳就是您必须考虑的保留阈值,以便VACUUM操作能完全移除已删除的文件。

使用REORG TABLE 应用变更

通过重写文件来重组Delta Lake表,以清除软删除的数据,例如被删除向量标记为删除的行,使用REORG TABLE命令:

REORG TABLE events APPLY (PURGE);

 -- If you have a large amount of data and only want to purge a subset of it, you can specify an optional partition predicate using `WHERE`:
REORG TABLE events WHERE date >= '2022-01-01' APPLY (PURGE);

REORG TABLE events
  WHERE date >= current_timestamp() - INTERVAL '1' DAY
  APPLY (PURGE);

注意

  • REORG TABLE 仅重写包含软删除数据的文件。

  • 当清理操作生成的文件较小时,REORG TABLE会将它们合并成更大的文件。更多信息请参阅OPTIMIZE

  • REORG TABLE幂等的,这意味着如果在同一数据集上运行两次,第二次运行将不会产生任何效果。

  • 运行REORG TABLE后,软删除的数据可能仍存在于旧文件中。您可以运行VACUUM来物理删除旧文件。