总体流程:根据用户给定的 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 查询流程相关推荐

  1. mysql查询流程解析及重要知识总结

    时光荏苒啊!在过两个月我就工作满三年了,大学毕业的情景还历历在目,而我已经默默的向油腻中年大叔进发了.作为一名苦逼的后端工程师,我搞过一段时间python,现在靠java糊口,但后来才发现,始终不弃我 ...

  2. elementui带输入建议查询_2020年度初级会计成绩查询指南!查询入口+查询流程+常见问题答疑...

    让广大初级考生第一时间查到成绩,我们将查询入口.查询流程及问题解答进行了一系列的归纳整理,一切只为给初级考生开路! 01成绩查询入口 全国会计资格评价网:http://kzp.mof.gov.cn/c ...

  3. es集群节点数和分片数关系_ES数据插入和查询流程是怎么样的?

    ES集群的状态有哪些,为什么主分片数目是固定的,副本分片却能动态调节,快看看这些关于ES的问题你都知道吗? 1. ES集群的状态 green 最健康的状态,说明所有的分片包括备份都可用 yellow ...

  4. 12306之余票查询流程解析

    前言 本套教程共分3章: 12306之登录流程解析 12306之余票查询解析 12306之下单流程解析 本套内容主要用于分析12306购票流程,意在编写一套自动购票小程序.12306接口 api 经常 ...

  5. Flowable通过api查询流程返回流程图节点

    通过传入流程启动id去查询当前流执行节点 返回流程图 到期节点 标红显示 /*** 生成流程图** @param processId 任务ID*/@RequestMapping(value = &qu ...

  6. ES5.6.4源码解析--聚合查询流程

    es的聚合查询会涉及到很多概念,比如fielddata,DocValue,也会引出很多问题,比如聚合查询导致的内存溢出.在没有真正了解聚合查询的情况下,我们往往对这些概念,问题都是云山雾绕的.本文我们 ...

  7. JDBC:软件架构、概述、数据库连接:普通项目添加jar包,URL、sql注入,类型转换,查询流程表、操作BLOB类型字段、批量插入,替换jar包、事务/数据库连接池

    0 常识说明 0.1 软件架构方式介绍 B/S架构:浏览器 与 服务器之间的交互. C/S架构:安装的本地软件(如:今日头条等) 与 服务器进行交互. 0.2 JavaWeb技术概览 JDBC核心技术 ...

  8. 泛微oa数据库之查询流程批次条件、出口条件

    select e.typename as 流程目录, a.id 流程ID, a.workflowname as 流程名称, b.groupname as 流程节点, c.conditioncn as ...

  9. ES查询流程图解与思考

    1.ES有那些搜索方式? Elasticsearch的搜索类型(SearchType类型) 1. query and fetch 向索引的所有分片 ( shard)都发出查询请求, 各分片返回的时候把 ...

最新文章

  1. 台湾炸鸡连锁店供应过期肉品 工厂停业违规品下架
  2. win10系统下安装Navicat for MySql 连接出现错误解决方法
  3. 服务器放n个网站,服务器放n个网站
  4. GitHub上Star 量最高的 5 个机器学习项目
  5. 加州大学欧文分校 计算机专业,UCI的Computer Science「加州大学欧文分校计算机科学系」...
  6. java监听文件改名字_java监听文件目录的改变
  7. 在计算机网络中使用modem时它的功能是,在计算机网络中使用MODEM时,它的功能是____。...
  8. RecyclerView.ItemDecoration 间隔线
  9. ubuntu下/etc/rc.local和/etc/init.d/rc.local的区别
  10. 河南理工大学c语言答案,河南理工大学C语言课后习题答案.ppt
  11. python股票成交明细_AkShare-股票数据-龙虎榜-机构席位成交明细
  12. C++——以任意数为底的对数
  13. 拒绝精神内耗,5个适合中年人的自学网站,让你脱胎换骨
  14. Kryo 高性能序列化和反序列化
  15. 瑞鹄转债上市价格预测
  16. 2021.11.8-11.14 AI行业周刊(第71期):AI行业经验
  17. 知乎:在卡内基梅隆大学 (Carnegie Mellon University) 就读是怎样一番体验?
  18. Markdown/KaTeX/LaTeX语法、工具及模板大全(持续更新ing...)
  19. Day5作业,商城+ATM机+后台管理
  20. annotations are not allowed here

热门文章

  1. CSDN文章质量检测系统
  2. pythonselenium软件_Python+Selenium开发工具安装及下载
  3. 用户直呼 “用不起”,共享充电宝大涨价
  4. java五子棋实验报告6_Java实现两人五子棋游戏(六) 行棋方变换
  5. 天天炫斗翻牌方法--让你抽到好装备!!
  6. 如何通过AI性格分析填补虚拟试用市场的空缺?
  7. SpringBoot集成Redis使用Lettuce
  8. 关于QQ抓包,IP准确性的问题
  9. 500家国内AI企业大数据分析:产业布局与融投风云
  10. Ansys仿真TDR