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

183 阅读2分钟

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

本节课程主要介绍Parquet、ORC以及列式存储。

一、列式存储

典型的大数据系统可以简单的概括为由业务层、计算层和存储层三层结构组成。

在存储层,HDFS 是 Hadoop 生态里第一个分布式存储服务,大数据生态里几乎所有的计算引擎都是基于 HDFS 协议和 HDFS Client 构建的。

行式存储: 每一行 (Row) 的数据在文件的数据空间里连续存放的,读取整行的效率比较高,一次顺序 IO 即可。

列式存储: 每一列 (Column) 的数据在文件的数据空间里连续存放的,同列的数据类型一致,压缩编码的效率更好。

二、Parquet

Parquet 是一种开源的、面向列的数据文件格式,旨在实现高效的数据存储和检索。它提供了高效的数据压缩和编码方案,具有增强的性能,可以批量处理复杂的数据。Parquet 支持多种语言,包括 Java、C++、Python 等...

Parquet支持多种压缩算法:snappy、gzip、zstd。索引主要依赖 Min-Max Index 和 排序 来加速查找。

三、ORC

ORC是适用于 Hadoop 工作负载的最小、最快的列式存储。

ORC 是一种为 Hadoop 工作负载设计的自描述类型感知列文件格式。它针对大型流式读取进行了优化,但集成了对快速查找所需行的支持。以列格式存储数据使读者可以仅读取、解压缩和处理当前查询所需的值。

ORC 会给包括根节点在内的中间节点都创建一个 Column。索引支持 Clusterd Index,更快的主键查找;支持 Bitmap Index,更快的过滤。

四、Parquet vs ORC

  • 从原理层面,最大的差别就是对于 NestedType 和复杂类型处理上
  • Parquet 的算法上要复杂很多,带来的 CPU 的开销比 ORC 要略大
  • ORC 的算法上相对简单,但是要读取更多的数据
  • Parquet 在复杂 Schema 场景下的算法开销影响较大,在 Spark 场景下 Parquet 工作的更好;在 Hive 场景下,ORC 更好