ORC、Parquet等列式存储的优点

  • 总结
  • 前言
  • 列式存储
  • Parquet:
  • ORC:
  • 更多参考


总结

  • 共同点
  • 列式存储
  • 二进制存储
  • 差异
  • 如果您在 Hadoop 生态系统中使用多种工具,则 Parquet 在适应性方面是一个更好的选择
  • parquet更好地优化了与Spark的使用,而 ORC 则针对Hive进行了优化。但在大多数情况下,两者非常相似,两者之间没有显著差异。

前言

  • ORC和Parquet都是高性能的存储方式,这两种存储格式总会带来存储和性能上的提升。

列式存储

  • 可以提升其查询性能,但是它是如何做到的呢?这就要从列式存储的原理说起,从图1中可以看到,相对于关系数据库中通常使用的行式存储,在使用列式存储时每一列的所有元素都是顺序存储的。由此特点可以给查询带来如下的优化:
  • 查询的时候不需要扫描全部的数据,而只需要读取每次查询涉及的列,这样可以将I/O消耗降低N倍,另外可以保存每一列的统计信息(min、max、sum等),实现部分的谓词下推。
  • 由于每一列的成员都是同构的,可以针对不同的数据类型使用更高效的数据压缩算法,进一步减小I/O。
  • 由于每一列的成员的同构性,可以使用更加适合CPU pipeline的编码方式,减小CPU的缓存失效。
  • 行式存储VS列式存储

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文件是自解析的,文件中包括该文件的数据和元数据。

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

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

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

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

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

更多参考
  • Parquet与ORC:高性能列式存储格式
  • RC ORC Parquet 格式比较和性能测试
  • ORC 和 Parquet比较入门