从上图可以看出,使用 Iceberg COW(Copy on write)方式进行特征回填,通过 BackFill 任务将原快照中的数据全部读出来,然后添加新列,进而写出到新的 Data File 中,并生成新的快照。
这种方式的缺点在于,仅仅新增一列数据的写入,却需要整体数据全部读出随后再全部写回,不仅浪费了大量的计算资源和存储资源;因此,我们基于开源的 Iceberg 自研了一种 MOR(Merge on Read)的 BackFill 方案。
(2)MOR
从上图可以看出,在 MOR 方案中,我们仍然需要一个 BackFill 任务来读取原始的 Data File 文件;所不同的是,我们只需读取少数需要的字段。比如我们需要对 A 列通过一些计算逻辑生成 C 列,那么 BackFill 任务只需从 Snapshot1 中读取 A 列的数据,且只需将 C 列的 update 文件写入 Snapshot2。
随着新增列的增多,我们需要将 update 文件合并到 Data File 里面;为此,我们进一步提供一种 Compaction 逻辑,即读取旧的 Data File 和 Update File,并合并生成新的 Data File。实现细节如下:
① 旧 Data File 和 Update File 都需要一个主键,并且每个文件都需要按照主键排序。
② 读取旧 Data File 时,会根据用户选择的列,分析具体需要哪些 Update File 和 Data File。