Parquet 查询流程
总体流程:根据用户给定的 Filter,先对文件中所有 RowGroup (Block) 过滤一遍,留下满足要求的 RowGroup。对这些 RowGroup 中涉及到的所有 Chunk 都读出来,对其中的 Page 一个一个解压缩,拼成一个一个 Record,再进行过滤。
细节:
- 不管一个 page 是否满足条件,都会被反序列化。
- 将多个 page 的东西拼成一个 record,并进行过滤,过滤结果放到 IncrementallyUpdatedFilterPredicate 谓词里,并根据这个结果选择是否返回这行数据。
读取流程
读取文件元数据
首先在 ParquetReader.build 时,读取文件尾部的 Footer,里边有整个文件的元数据,即ParquetMetadata。
初始化: ParquetReader.initReader()
- 过滤 RowGroup。根据 RowGroup 中的统计信息和 Filter,对文件中的所有 RowGroup 进行过滤,将不满足的 RowGroup 丢掉。
构造 RecordReader: InternalParquetRecordReader.checkRead()
- 读取一个 RowGroup (包含各个 Chunk 的 PageReader),将查询涉及的所有 Chunk 的字节读到内存中。
- 对每个 Chunk,将其所有 Page 构造出来,用字节数组填充,作为压缩后的 Page,并用这些压缩的 Page 和解码器构造一个 ColumnChunkPageReader。
- 根据这些 ColumnChunkPageReader 构造 RecordReader。构造了一个 RecordReaderImplementation。并且在 ColumnReaderImpl 的 checkRead() 方法里开始读 Page,解压缩 page。
读取一行数据
- 根据 Definition Level 和 Repetition Level 的计算方法构造出一行一行 Record 来,这一行 Record 如果为 Null,就是不满足条件,继续构造 Record。在过滤的时候一直维护一个 IncrementallyUpdatedFilterPredicate,这个谓词里记录了当前 record 是否满足条件,在 IncrementallyUpdatedFilterPredicateBuilder 里根据新的数据更新这个谓词的状态。
查询代码
- 依赖
<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.7.7</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.11</artifactId><version>2.3.0</version></dependency>
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.parquet.column.ParquetProperties;
import org.apache.parquet.example.data.Group;
import org.apache.parquet.example.data.simple.SimpleGroupFactory;
import org.apache.parquet.filter2.compat.FilterCompat;
import org.apache.parquet.hadoop.ParquetInputFormat;
import org.apache.parquet.hadoop.ParquetReader;
import org.apache.parquet.hadoop.ParquetWriter;
import org.apache.parquet.hadoop.api.ReadSupport;
import org.apache.parquet.hadoop.example.GroupReadSupport;
import org.apache.parquet.hadoop.example.GroupWriteSupport;
import org.apache.parquet.hadoop.metadata.CompressionCodecName;
import org.apache.parquet.schema.MessageType;
import org.apache.parquet.schema.PrimitiveType;
import org.apache.parquet.schema.Type;
import org.apache.parquet.schema.Types;Configuration conf = new Configuration();ParquetInputFormat.setFilterPredicate(conf,and(gtEq(longColumn("long_column"), startTime),ltEq(longColumn("long_column"), endTime)));FilterCompat.Filter filter = ParquetInputFormat.getFilter(conf);Types.MessageTypeBuilder builder = Types.buildMessage();builder.addField(new PrimitiveType(Type.Repetition.REQUIRED, PrimitiveType.PrimitiveTypeName.INT64, "long_column"));builder.addField(new PrimitiveType(Type.Repetition.OPTIONAL, PrimitiveType.PrimitiveTypeName.DOUBLE, "double_column"));MessageType querySchema = builder.named("default_schema_name");conf.set(ReadSupport.PARQUET_READ_SCHEMA, querySchema.toString());// set readerParquetReader.Builder<Group> reader= ParquetReader.builder(new GroupReadSupport(), new Path("file_path")).withConf(conf).withFilter(filter);ParquetReader<Group> build;int result = 0;try {build = reader.build();Group line;while((line=build.read())!=null) {result++;}} catch (IOException e) {e.printStackTrace();}
Parquet 查询流程相关推荐
- mysql查询流程解析及重要知识总结
时光荏苒啊!在过两个月我就工作满三年了,大学毕业的情景还历历在目,而我已经默默的向油腻中年大叔进发了.作为一名苦逼的后端工程师,我搞过一段时间python,现在靠java糊口,但后来才发现,始终不弃我 ...
- elementui带输入建议查询_2020年度初级会计成绩查询指南!查询入口+查询流程+常见问题答疑...
让广大初级考生第一时间查到成绩,我们将查询入口.查询流程及问题解答进行了一系列的归纳整理,一切只为给初级考生开路! 01成绩查询入口 全国会计资格评价网:http://kzp.mof.gov.cn/c ...
- es集群节点数和分片数关系_ES数据插入和查询流程是怎么样的?
ES集群的状态有哪些,为什么主分片数目是固定的,副本分片却能动态调节,快看看这些关于ES的问题你都知道吗? 1. ES集群的状态 green 最健康的状态,说明所有的分片包括备份都可用 yellow ...
- 12306之余票查询流程解析
前言 本套教程共分3章: 12306之登录流程解析 12306之余票查询解析 12306之下单流程解析 本套内容主要用于分析12306购票流程,意在编写一套自动购票小程序.12306接口 api 经常 ...
- Flowable通过api查询流程返回流程图节点
通过传入流程启动id去查询当前流执行节点 返回流程图 到期节点 标红显示 /*** 生成流程图** @param processId 任务ID*/@RequestMapping(value = &qu ...
- ES5.6.4源码解析--聚合查询流程
es的聚合查询会涉及到很多概念,比如fielddata,DocValue,也会引出很多问题,比如聚合查询导致的内存溢出.在没有真正了解聚合查询的情况下,我们往往对这些概念,问题都是云山雾绕的.本文我们 ...
- JDBC:软件架构、概述、数据库连接:普通项目添加jar包,URL、sql注入,类型转换,查询流程表、操作BLOB类型字段、批量插入,替换jar包、事务/数据库连接池
0 常识说明 0.1 软件架构方式介绍 B/S架构:浏览器 与 服务器之间的交互. C/S架构:安装的本地软件(如:今日头条等) 与 服务器进行交互. 0.2 JavaWeb技术概览 JDBC核心技术 ...
- 泛微oa数据库之查询流程批次条件、出口条件
select e.typename as 流程目录, a.id 流程ID, a.workflowname as 流程名称, b.groupname as 流程节点, c.conditioncn as ...
- ES查询流程图解与思考
1.ES有那些搜索方式? Elasticsearch的搜索类型(SearchType类型) 1. query and fetch 向索引的所有分片 ( shard)都发出查询请求, 各分片返回的时候把 ...
最新文章
- 台湾炸鸡连锁店供应过期肉品 工厂停业违规品下架
- win10系统下安装Navicat for MySql 连接出现错误解决方法
- 服务器放n个网站,服务器放n个网站
- GitHub上Star 量最高的 5 个机器学习项目
- 加州大学欧文分校 计算机专业,UCI的Computer Science「加州大学欧文分校计算机科学系」...
- java监听文件改名字_java监听文件目录的改变
- 在计算机网络中使用modem时它的功能是,在计算机网络中使用MODEM时,它的功能是____。...
- RecyclerView.ItemDecoration 间隔线
- ubuntu下/etc/rc.local和/etc/init.d/rc.local的区别
- 河南理工大学c语言答案,河南理工大学C语言课后习题答案.ppt
- python股票成交明细_AkShare-股票数据-龙虎榜-机构席位成交明细
- C++——以任意数为底的对数
- 拒绝精神内耗,5个适合中年人的自学网站,让你脱胎换骨
- Kryo 高性能序列化和反序列化
- 瑞鹄转债上市价格预测
- 2021.11.8-11.14 AI行业周刊(第71期):AI行业经验
- 知乎:在卡内基梅隆大学 (Carnegie Mellon University) 就读是怎样一番体验?
- Markdown/KaTeX/LaTeX语法、工具及模板大全(持续更新ing...)
- Day5作业,商城+ATM机+后台管理
- annotations are not allowed here