Parquet 写数据过程及源代码分析

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,哈哈~~,写的有点绕,只是想表达一下这个调用结构。

下面看一下整个流程图

Parquet 写数据过程及源代码分析_第1张图片

这里的流程图主要表达了数据在内存中的写入过程,没有涉及文件的写入。

你可能感兴趣的:(Java的一些源代码)