数据湖-Iceberg-源码学习-Kernel-Table Format-数据读取-数据过滤
一、概述
在 Iceberg 中自上而下买现了三层的数据过滤策路分别是: 分区裁剪、文件过滤和 RowGroup 过滤。
二、设计
2.1. 分区剪裁
Iceberg 支持分区裁剪优化,对于分区表来说,优化器可以自动从 where 条件中根据分区键直接提取出需要访问的分区,从而避免扫描所有的分区,降低了 IO 请求。
Iceberg 实现分区剪枝并不依赖文件所在的目录,而是利用了 Iceberg 的文件布局。在 Iceberg 的每个 Snapshot 中都存储所有 manifest 清单文件的包含分区列信息,每个清单文件每个数据文件中存储分区列值信息。这些元数据信息可以帮助确定每个分区中包含哪些文件。
这样实现的好处是:
- 无需调用文件系统的 list 操作,可以直接定位到属于分区的数据文件。
- partition 的存储方式是透明的,用户在查询时无需指定分区,Iceberg 可以自己实现分区的转换,即使用户修改分区信息后,用户无需重写之前的数据。
2.2. 文件过滤
Iceberg 提供了文件级别的统计信息,例如 Min/Max 等。可以用 where 语句中的过滤条件去判断目标数据是否存在于文件中。
在 SparkSQL 中,会把查询的过滤条件,下推到靠近存储层,减少从存储层读取的数据量。其次在读取过滤数据时,Spark 并不自己实现谓词下推,而是交给文件格式的 reader 来解决。
例如对于 parquet 文件,Spark 使用 PartquetRecordReader 或 VectorizedParquetRecordReader 类来(非向量化/向量化)读取parquet 文件。在构造 reader 类时需要提供 filter的参数(过滤条件)。过滤逻辑稍后由 RowGroupFilter 调用,根据文件中块的统计信息或存储列的元数据验证是否应该删除读取块。
相比于 Spark, Iceberg 会在 snapshot 层面基于元数据信息过滤掉不满足条件的 datafile。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker!
评论
ValineTwikoo











