列存储格式学习

背景

学习一下常用的列存储格式。

概况

内容整理自 [2]

块压缩 读性能 写性能 增加列 场景 备注
CSV 不支持 很低 部分支持,只能加到末尾
JSON 不支持 全面支持
Sequence 不支持 只能追加字段 Hadoop 中间数据
RCFile (Record Columnar) 支持 很好 Hadoop 上第一个列存储
ORC (Optimized RC) 比 RCFile 更好 更好 不支持 Hortonworks/Hive
Parquet 很好 很好 比较慢 有限 Cloudera/Impala
Avro 很好?
  • 数据格式:text、RC、Parquet、ORC
  • 相同大小的原始数据集,转换成相应的格式之后的文件大小:Text > RC > Parquet > ORC

具体数据

内容整理自 [3],进行了归一化处理,以 RCFile 为基准。

存储格式 压缩比 存储时间 查询时间
RCFile 100% 100% 100%
ORC 2.8% 98.6% 22.2%
SequenceFile 105% 115.1% 208.0%
Parquet 17.24% 98.9% 27.4%
Avro 104.5% 100.2% 318.2%

初步结果

  • 压缩比:ORC >> Parquet >> Avro, SequenceFile, RCFile ORC 较大领先压缩比最高
  • 存储时间:ORC, Parquet > RCFile, SequenceFile, Avro 差别不大
  • 查询时间:ORC > Parquet >> RCFile > SequenceFile > Avro 列存储都比较快,压缩比越高越快

综合结果

首选 ORC, 次选 Parquet

备注

我们内部测试的时候:

  1. ORC 的大小是 Parquet 的 1/2 ~ 1/3,没有达到 [3] 中的近 1/8 的效果。
  2. JSON 的大小约为 CSV 的 2.5 倍,这个是可以理解的,JSON 中 meta 信息是完整的。

来源

  1. Data Lake Analytics > 最佳实践 > CSV 文件格式
  2. text、RC、Parquet、ORC
  3. Hive 的几种常见压缩格式(ORC,Parquet,Sequencefile,RCfile,Avro)的读写查询性能测试