订阅更新

Parquet和ORC怎么选?生产环境用哪个?

Hive手册 第 9 题 约 3 分钟读完

本文目录
  1. 先说结论
  2. 为什么Spark上Parquet更快?
  3. 详细对比
  4. 压缩算法怎么选?
  5. 实战经验:统一格式后的效果
  6. 总结

先说结论

一句话总结:用Spark引擎就选Parquet,用Hive原生引擎就选ORC。 现在大多数公司都用Spark作为执行引擎,所以Parquet是主流选择。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

文件格式的选择直接影响存储成本和查询性能。很多人知道“列式存储比行式快”,但问到Parquet和ORC具体怎么选就答不上来了。今天用我在三家公司的真实经验来讲清楚。

为什么Spark上Parquet更快?

Parquet是Spark的原生数据源,Catalyst优化器对Parquet做了大量专属优化:

① 分区裁剪更彻底: Parquet的元数据里有每个Row Group的统计信息(最小值、最大值),Catalyst可以跳过不符合条件的Row Group。

② 向量化读取(Vectorized Reader): Spark对Parquet默认开启向量化读取,批量处理数据,CPU缓存命中率更高。

③ Tungsten内存格式兼容: Parquet的内存布局和Tungsten的二进制格式更匹配,转换开销更小。

详细对比

维度ParquetORC
起源Twitter/ClouderaFacebook → Apache Hive
Spark支持原生数据源,性能最优支持但非原生,性能稍差
Hive支持支持原生,性能最优
默认压缩Snappy(快)ZLIB(压缩率高)
索引能力列统计信息列统计 + Bloom Filter + 轻量索引
嵌套类型支持非常好(原生支持)支持但稍弱
多引擎生态Spark/Flink/Trino/Presto全部原生主要是Hive生态
ACID事务不支持(需要Delta/Iceberg)支持(Hive ACID)

压缩算法怎么选?

Snappy: 压缩/解压速度快,压缩率一般。适合热数据(经常查询的)。

Zstd: 压缩率高且速度不慢,Spark 3.x开始支持。适合存储成本敏感的场景。

Gzip/ZLIB: 压缩率最高但慢。适合归档数据(很少查询)。

实战经验:统一格式后的效果

我在出海硬件公司迁移到Databricks时,把原来的混合格式(部分ORC、部分Parquet、甚至还有JSON和CSV)统一切换为Parquet + Snappy压缩。

效果:存储空间整体减少40%(主要是JSON/CSV→Parquet的压缩收益),查询性能平均提升30%。后来升级到Delta Lake后,底层仍然是Parquet,只是加了一层事务日志。

总结

记住一句话:Spark选Parquet,Hive原生选ORC。压缩选Snappy(热数据)或Zstd(省空间)。面试的时候能说清楚“为什么Spark上Parquet更快”(原生支持 + 向量化读取 + Tungsten兼容),再加一个格式统一后的实战效果,就很完整了。

下一篇聊数据血统——老板问“这个指标是怎么算的”,你怎么快速追溯?这是数据治理的核心能力。

你们生产环境用的什么文件格式和压缩算法?评论区聊聊~

关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长

刷题进度保存在当前浏览器