Parquet 与 ORC:高性能列式存储|青训营笔记

160 阅读3分钟

这是我参与「第四届青训营」笔记创作活动的第 13 天

什么是列式存储

传统的数据编码方式是以行为单位进行,列式存储则是将数据划分成数据块,每个数据块内部按列的方式进行编码存储,通过使用列式存储会有以下好处:

  • 存储效率更高,因为同一列的数据类型一致,编码效率也会更高
  • 查询效率更高,利用列式存储的统计信息,可以跳过大量的数据,减少IO压力

Parquet 和 ORC的基本对比

image.png

Parquet 和 ORC的编码效率对比

image.png

parquest与ORC的分析

1.Parquet

(1)Parquet 支持嵌套的数据模型,类似于 Protocol Buffers,每一个数据模型的 schema 包含多个字段,每一个字段有三个属性:重复次数、数据类型和字段名,重复次数可以是以下三种:required (只出现 1 次),repeated (出现 0 次或多次),optional (出现 0 次或 1 次)。每一个字段的数据类型可以分成两种: group (复杂类型) 和 primitive (基本类型)。

(2)Parquet 中没有 Map、Array 这样的复杂数据结构,但是可以通过 repeated 和 group 组合来实现的。

(3)由于 Parquet 支持的数据模型比较松散,可能一条记录中存在比较深的嵌套关系,如果为每一条记录都维护一个类似的树状结可能会占用较大的存储空间,因此 Dremel 论文中提出了一种高效的对于嵌套数据格式的压缩算法:Striping/Assembly 算法。通过 Striping/Assembly 算法,parquet 可以使用较少的存储空间表示复杂的嵌套格式,并且通常 Repetition level 和 Definition level 都是较小的整数值,可以通过 RLE 算法对其进行压缩,进一步降低存储空间。

Parquet 文件是以二进制方式存储的,是不可以直接读取和修改的,Parquet 文件是自解析的,文件中包括该文件的数据和元数据。

2.ORC

(1)ORC 文件是自描述的,它的元数据使用 Protocol Buffers 序列化,并且文件中的数据尽可能的压缩以降低存储空间的消耗;

(2)和 Parquet 类似,ORC 文件也是以二进制方式存储的,所以是不可以直接读取 ORC 文件也是自解析的,它包含许多的元数据,这些元数据都是同构 ProtoBuffer 进行序列化的;

ORC 和 Parquet 存储的优点有哪些?

(3)ORC 会尽可能合并多个离散的区间尽可能的减少 I/O 次数;

(4)ORC 中使用了更加精确的索引信息,使得在读取数据时可以指定从任意一行开始读取,更细粒度的统计信息使得读取 ORC 文件跳过整个 row group,ORC 默认会对任何一块数据和索引信息使用 ZLIB 压缩,因此 ORC 文件占用的存储空间也更小;

(5)在新版本的 ORC 中也加入了对 Bloom Filter 的支持,它可以进一步提升谓词下推的效率,在 Hive 1.2.0 版本以后也加入了对此的支持。