国家电网账号注册网站帐号是什么,网站建设工作量评估报价表,百度网址导航主页,优秀创意网站写在前面
最近在自己做自定义的OLAP系统#xff0c;文件格式上用的是Parquet#xff0c;但是发现Parquet各个API的示例代码很少。所以就打算把这个系列的文章写一下。
1. Parquet的Filter
Parquet的过滤支持两大类#xff0c;一类是基于Footer中的元数据进行RowGroup级别…写在前面
最近在自己做自定义的OLAP系统文件格式上用的是Parquet但是发现Parquet各个API的示例代码很少。所以就打算把这个系列的文章写一下。
1. Parquet的Filter
Parquet的过滤支持两大类一类是基于Footer中的元数据进行RowGroup级别的过滤这种过滤能够实现减少IO的目的它通过元数据里的信息直接可以实现跳过RowGroup的读取。 另一类是对每一行进行过滤此类对于减少IO没有作用只是代码优雅一些不用把所有的数据都读到客户端代码里进行过滤。
2. Parquet对RowGroup的过滤的基本介绍
当前最新版本1.12.x 中支持3类
字典 - 如果列的值域空间不大则用字典parquet能够自己识别是否使用字典作为一列的过滤器statistics - 数值型的min/maxbloomFilter - 如果列值域比较大则不是相对分段聚合的则无法用1-2.则考虑用bloomFilter如果使用bloomFilter需要在写入时指定要使用bloomFilter的列
3. Parquet 应用BloomFilter的示例代码
3.1 写入Parquet文件
并指定user_id列使用BloomFilter ParquetWriterObject parquetWriter AvroParquetWriter.builder(path).withSchema(userFlowTraceSchema).withCompressionCodec(CompressionCodecName.GZIP).withBloomFilterEnabled(user_id, true).build();3.2 读取Parquet文件
目前BloomFilter仅支持Eq和In操作其他类型和自定义的操作都直接被返回了 BLOCK_MIGHT_MATCHtrue- 即不过滤 源码见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))));
ParquetReaderGroup reader ParquetReader.builder(readSupport, path).withFilter(bloomFilterIn).build();