Parquet学习与使用之BloomFilter的应用
创始人
2024-05-29 15:50:16

写在前面

最近在自己做自定义的OLAP系统,文件格式上用的是Parquet,但是发现Parquet各个API的示例代码很少。所以就打算把这个系列的文章写一下。

1. Parquet的Filter

Parquet的过滤支持两大类,一类是基于Footer中的元数据进行RowGroup级别的过滤;这种过滤能够实现减少IO的目的,它通过元数据里的信息直接可以实现跳过RowGroup的读取。
另一类是对每一行进行过滤,此类对于减少IO没有作用,只是代码优雅一些,不用把所有的数据都读到客户端代码里进行过滤。

2. Parquet对RowGroup的过滤的基本介绍

当前最新版本1.12.x 中支持3类:

  1. 字典 - 如果列的值域空间不大,则用字典(parquet能够自己识别是否使用字典作为一列的过滤器)
  2. statistics - 数值型的min/max
  3. bloomFilter - 如果列值域比较大,则不是相对分段聚合的,则无法用1-2.则考虑用bloomFilter(如果使用bloomFilter需要在写入时指定要使用bloomFilter的列)

3. Parquet 应用BloomFilter的示例代码

3.1 写入Parquet文件

并指定user_id列使用BloomFilter

        ParquetWriter parquetWriter = AvroParquetWriter.builder(path).withSchema(userFlowTraceSchema).withCompressionCodec(CompressionCodecName.GZIP).withBloomFilterEnabled("user_id", true).build();
 

3.2 读取Parquet文件

目前BloomFilter仅支持Eq和In操作;其他类型和自定义的操作都直接被返回了 BLOCK_MIGHT_MATCH(true)- 即不过滤
源码见:org.apache.parquet.filter2.bloomfilterlevel.BloomFilterImpl

读取文件,并使用BloomFilter的示例:

GroupReadSupport readSupport = new GroupReadSupport();
String targetUserId1 = "9639102999811";
String targetUserId2 = "9639102999711";
Filter bloomFilterIn = FilterCompat.get(FilterApi.in(FilterApi.binaryColumn("user_id"),Sets.newHashSet(Binary.fromString(targetUserId1),Binary.fromString(targetUserId2))));
ParquetReader reader = ParquetReader.builder(readSupport, path).withFilter(bloomFilterIn).build();

相关内容

热门资讯

委员声音 | 全国政协委员张凤... (来源:人民政协报)转自:人民政协报习近平总书记在看望参加全国政协十四届四次会议的农工党、九三学社、...
赶飞机注意!双流机场即将上新! 转自:成都发布自3月29日开始乘坐山东航空、春秋航空的旅客需注意赶往机场前先要看清楚所乘航班是在双流...
77岁阿姨腿上“蚯蚓”突然消失... 来源:潮新闻 腿上青筋凸起、蜿蜒扭曲,如同一条条蚯蚓盘踞在腿部,这种常见现象,医学上称为下肢静脉曲张...
李稻葵:“内卷式”竞争治理已经... 3月22日,清华大学中国经济思想与实践研究院院长李稻葵在中国发展高层论坛2026年年会期间对澎湃新闻...
张水华回应辞职后首冠:跑完后很... 转自:青蕉视频 【#张水华回应辞职后首冠#:跑完后很兴奋...