storage format - noonecare/opensourcebigdatatools GitHub Wiki

Parquet

Parquet 堪称 HDFS 上保存文件的事实标准。 读写 parquet 非常方便,hadoop 上的很多工具(spark, map-reduce, hive 等等)都有读写 parquet 文件的现成的 API。

Parquet 是 columnar storage 的, columnar storage 最明显的好处有:

  • 只查询部分列时,不必读写全部的列。如果是 row storage 的,就算你只读写一列,也必须读写其他所有列。
  • 对于不同的列可以使用针对该列数据类型的压缩保存方式,减少硬盘占用,减小读写时间。

Parquet 实际保存时,一个 parquet 文件由一个或者多个 Row Group 组成

Row Group 保存了好几行的数据。 Row Group 由 Column Chunk 组成, 每个 Column Chunk 中保存着单独的一列数据。有多少列,就有多少个 Column Chunck

Column Chunk 由一个或者多个 Page 组成。单个 Page 一定具有相同的 encoding 和 compression, 但是属于同一个 Column Chunk 的多个 Page 不要求 encoding 和 compression 必须一致。

parquet page 保存时常用的 encoding 有:

  • bit packing
  • run length
  • dictionary
  • extensible

Parquet 文件是如何序列化和反序列化的:

使用 Dremel 算法实现序列化和反序列化

schema 对应一棵树(primitive type 的数据是这棵树的叶子节点,有几个叶子节点有几个 column chunck), 用 Repetition Level 和 Definition Level 描述树的节点,给树的节点赋值。

Parquet 是支持 nest data type 的。