一、概述

Iceberg 中删除操作通常分为两个步骤: 删除表的数据和元数据。

  1. 删除表的数据

    Iceberg 删除表的数据文件使用 DeleteFiles 类,它提供了一组方法用于删除表中的数据文件。

  2. 删除表的元数据

    删除表的元数据通过 Catalog 类实现, Catalog 提供了一组方法用于删除 Iceberg 表和相关元数据

二、设计

v0.10.0 之后,Iceberg 除了存储数据的文件 DataFile 以外,还引入了一种新的文件 DeleteFile

DeleteFile 里面保存的是 “哪一条数据被删除” 的记录。当 Iceberg 提交一次写入(也就是创建一个新的 snapshot) 时,如果这次写入操作里删除了过去的某条记录,Iceberg 并不会直接删除 DataFile 里面的数据。

在 HDFS 和对象存储上,无法修改一个已经存在的文件

所以 Iceberg 把这条记录的 id 写入一个 DeleteFile 里面。这个 DeleteFile 也是创建出的 snapshot 的一部分,被记录在 snapshot 的文件列表里面。

Iceberg 在读取这个 snapshot 的数据时,会同时读取 DataFile 和 DeleteFile 的数据,然后把两边的数据合并,过滤掉同时出现在 DataFile 和DeleteFile 里的数据,实现了 delete 的效果。