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

579 阅读2分钟

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

Parquet 和 ORC:高性能列式存储

  1. 列式存储和行式存储的区别 ① 行式存储倾向于结构固定,即不论别人怎么变,行式存储始终是那些固定的结构进行存储。而列式存储倾向于结构弱化,按需自取,根据需要来进行存储,不会浪费存储空间。

    ② 行式存储一行数据只需一份主键,列式存储一行数据需要多份主键。

    ③ 行式存储存的都是业务数据,列式存储除了业务数据外,还要存储列名。

    ④ 行式存储更类似于一个Java Bean,所有字段都提前定义好,并且不能改变;而列式存储更像一个Map,不提前定义,但可以随意往里添加key/value。

Parquet 详解

数据模型

  • Protocol Buffer 定义
  • 支持可选和重复字段
  • 支持嵌套类型

Parquet 中的压缩方式

  • Page 完成 Encoding 以后,进行压缩

  • Parquet支持的多种压缩算法:

    ① snappy: 压缩速度快,压缩比不高,适用于热数据

    ② gzip:压缩速度慢,压缩比高,适用于冷数据

    ③ zstd:新引入的压缩算法,压缩比和 gzip 差不多,但压缩速度略低于 Snappy。

Parquet的优劣对比:

  • 支持嵌套结构,这点对比同样是列式存储的OCR具备一定优势;
  • 适用于OLAP场景,对比CSV等行式存储结构,列示存储支持映射下推和谓词下推,减少了磁盘IO;
  • 同样的压缩方式下,列式存储因为每一列都是同构的,因此可以使用更高效的压缩方法;

Parquet & Spark

Parquet作为最通用的 Spark 数据格式,主要实现在:ParquetFileFormat。 害支持向量化读;向量化读是主流大数据分析引擎的标准实践,可以极大的提升查询性能。

Spark 以 Batch 的方式从 Parquet 读取数据,下推的逻辑也会适配 Batch 的方式。

ORC 详解

ORC产生于 Hive 项目。
ORC是大数据分析领域使用最广的列存格式之一。

数据模型

  • ORC 会给包括根节点在内的中间节点都创建一个 Column
  • 嵌套类型或者集合类型支持和 Parquet 差别较大
  • optional 和 repeated 字段依赖父节点记录额外信息来重新 Assembly 数据。

数据布局

ORC的数据布局类似于Parquet:

  • Rooter + Stripe + Column + Page 结构
  • Encoding / Compression / Index 支持上和 Parquet 几乎一致。

Parquet vs ORC 对比

  • 从原理层面来讲,最大的差别就是他们对于 NestedType 和复杂类型处理上。
  • Parquet 的算法上要复杂很多,带来的 CPU 的开销比 ORC 要大。
  • ORC 的算法上相对简单,但是要读取更多的数据。