Parquet 写数据过程及源代码分析
2016-03-07 11:50
288 查看
Parquet写数据过程及源代码分析
本文主要从parquet写数据的角度进行分析,主要涉及parquet从拿到数据模型到最终将一条记录经过计算、编码、压缩等过程写入内存的过程(暂时没有包括写入文件的过程,后续补充)。主要从以下几个方面进行介绍:
写流程涉及的类
写数据的过程
先看看在这个过程中涉及的类及其作用
这里介绍的类都是一些基类,具体的实现类大家可以去看里面具体的实现类...
valueWriter:这个类是一个父类,主要涉及相应的压缩操作,算是在写入文件之前最后调用的类。这个类不需要知道自己的输入具有什么含义,只需要按照相应的规则对输入的byte进行压缩即可,然后将输出结果保存在自己维护的一个ByteArrayOutputStream里面。
pageWriter:从类名可以直接看出,这个类是将数据按照page进行组织的一个类。它本身不涉及任何编码与压缩操作,它的作用是与valueWriter相配合,当valueWriter中的数据量达到一定阈值的时候,系统会将其中的数据写入到pageWriter中,具体后面会给出解析。
ColumnWriter:这个类是对一列进行写入操作的类,这个类包含一个
pageWriter和三个
valueWriter,三个valueWriter的作用分别是写入Value、Repeation level 、Definition level,当valueWriter中的数据总量达到一定阈值的时候,ColumnWriter会将其中的数据打包(其实就是连接起来…)一起写入到pageWriter中,相当于向pageWriter中添加了一个page,同时会将该page的header写入page中,header是由columnWriter中的statistic变量维护的。
ColumnWriterStore:不太清楚这个名字具体是怎么起出来的,这个叫Store的类可以认为是一个对
ColumnWriter的Map,里面保存了不同的
ColumnWriter,可以这么认为,ColumnWriterStore对应的是一个rowGroup,可以通过制定的ID获取到相应列的ColumnWriter
pageWriterStore:这个类的功能和
ColumnWriterStore类似,它里面保存的是不同的pageWriter
ColumnIO:可以认为这个类是一个管理器,它负通过给定的Schema构建数据模型,接收一条记录,并将记录交给ColumnWriter进行写,它有一个内部类,叫做
RecordConsumer,这个类的作用在下面进行介绍。这个类还有一个重要的功能就是针对给定的数据模型,计算各个记录的Definition Level 和 Repeation Level。是统筹数据写入阶段的一个管理器。
RecordConsumer:这个类可能是作者想要满足某些设计模式而实现的类。它在这里起到了一个纽带的作用,这个类会获得ColumnWriterStore的引用,并且会被数据模型中的具体实现类(例如BinaryValue)引用,从而间接地写数据(后面会降到该过程)
Group:Group在这里更像是一条记录,可以看做是一个Record的引用。
GroupWriter:GroupWriter的出现其实有些奇怪,在看了代码之后,发现它其实是为了更方面地写一条记录而加入得一个类,它具有一个 WriteGroup() 方法,我们知道在parquet中,一条记录本质上是一个嵌套结构,WriteGroup 方法其实是递归地对一个Group中的每个字段执行写入操作,每个字段是一个
Primitive类型,该类型会调用自己的writeValue()方法,去调用RecordConsumer中的ColumnWriterStore中的ColumnWriter中的ValueWriter,哈哈~~,写的有点绕,只是想表达一下这个调用结构。
下面看一下整个流程图
这里的流程图主要表达了数据在内存中的写入过程,没有涉及文件的写入。
相关文章推荐
- js生成uuid的方法
- iOS对UIViewController生命周期和属性方法的解析
- A request has been denied as a potential CSRF attack.”
- Map.values方法——获取Map集合中的所有键值对象
- mysql怎样利用sql语句对指定列添加unique属性
- SeaJS与RequireJS最大的区别
- IOS开发之修改UISearchBar的背景颜色
- UIView转成UIImage
- Reason: no suitable image found. Did find:
- 关于UITableView的cell复用问题的3种解决方法
- Command and Query Responsibility Segregation (CQRS) Pattern 命令和查询职责分离(CQRS)模式
- 108.Which two statements are true regarding the COUNT function? (Choose two.)
- DXXcodeConsoleUnicodePlugin debug栏打印时自动把/ueo6转化成汉字
- properties文件value换行处理方式
- Java队列Queue
- UIImage转NSData,NSData转UIImage
- Query cache(高速查询缓冲池)
- iOS 代码实现获得应用的版本号(Version/Build)
- android 6.0 SystemUI源码分析(2)-SystemUI启动流程
- 为UILabel添加点击事件