等值删除文件通过一个或多个列的值来标识数据文件集合中已删除的行,并且可以选择性地包含被删除行的其他列。
等值删除文件存储表中任意列的子集,并使用表的字段 ID(field ids)。删除列是删除文件中用于匹配数据行的列。删除列通过删除文件元数据中的 equality_ids 列来标识其 ID。用于等值删除文件的列的限制条件与标识字段(identifier fields)的限制条件相同,但有以下例外:允许使用可选列(optional columns)以及嵌套在可选结构体(optional structs)下的列(如果父结构体列为 null,则意味着叶子列也为 null)。
如果数据行的值与适用于其数据文件的等值删除文件中的任何一行的删除列的值完全匹配,则该数据行将被删除(参见 Scan Planning 部分)。
删除文件中的每一行都会生成一个等值谓词(equality predicate),用于匹配删除列值相等的任何数据行。多个列的匹配可以理解为多个等值谓词的 AND 组合。如果删除列中的值为 NULL,则它会匹配数据行中对应列值为 NULL 的行,相当于 col IS NULL。
假设有一个表,包含以下数据:
| 1: id | 2: category | 3: name |
|---|---|---|
| 1 | marsupial | Koala |
| 2 | toy | Teddy |
| 3 | NULL | Grizzly |
| 4 | NULL | Polar |
删除 id = 3 的行,可以通过以下两种等值删除文件实现:
-
仅包含
id列:equality_ids=[1] 1: id ------- 3 -
包含
id列及其他列:equality_ids=[1] 1: id | 2: category | 3: name -------|-------------|--------- 3 | NULL | Grizzly
删除 id = 4 AND category IS NULL 的行,可以通过以下等值删除文件实现:
equality_ids=[1, 2]
| 1: id | 2: category | 3: name |
| ----- | ----------- | ------- |
| 4 | NULL | Polar |
如果等值删除文件中的某个删除列在表中被删除(dropped),在应用等值删除时仍然需要使用该列。如果某个列被添加到表中,并随后被用作等值删除文件中的删除列,则在读取旧数据文件时,该列的值将按照正常的投影规则读取(默认值为 NULL)。