CodeWalk

Hive ORC与Parquet格式对比

作者:孤独的心 · 2026-05-30 12:55

请比较Hive中ORC和Parquet两种列式存储格式的优缺点,以及各自适合的场景。

回答

孤独的心

ORC(Optimized Row Columnar,由Hive团队开发):

特点:

  • Stripes架构: 文件分为Stripes(默认250MB),每个Stripe包含Index Data、Row Data、Stripe Footer
  • 轻量级索引: 每个Stripe存储min/max/布隆过滤器,跳过不匹配的行组
  • ACID支持: Hive 3.x支持ACID事务(需要ORC格式)
  • 压缩: 支持Zlib/Snappy/Lzo/LZ4/Zstd,内置字典编码
  • 谓词下推: 可在Stripes级别跳过不相关数据

Parquet(由Cloudera/Twitter开发,源于Google Dremel):

特点:

  • Row Group架构: 文件分为Row Groups,内部按Column Chunk存储
  • 嵌套类型支持: 原生支持复杂的嵌套数据结构(JSON/Protocol Buffers风格)
  • 编码丰富: PLAIN/DICTIONARY/DELTA/RUN_LENGTH
  • 跨生态支持: Spark/Impala/Drill/Presto/Druid等都支持
  • 谓词下推: 支持Page级别的统计信息过滤

对比表: | 维度 | ORC | Parquet | |------|-----|---------| | 文件结构 | Stripes | Row Groups + Column Chunks | | 压缩率 | 略高(Hive场景) | 中 | | 查询性能(Hive) | 更优(原生Hive格式) | 优 | | 嵌套类型 | 支持(v2+) | 原生支持(更好) | | ACID事务 | ✅(Hive) | ❌ | | 跨平台兼容性 | 主要在Hive生态 | 广泛(Spark/Impala/Presto) | | Schema演进 | 支持(添加列) | 支持(添加/删除列) |

选择建议:

  • Hive原生查询为主 → ORC(性能最佳)
  • 需要跨引擎查询(Spark+Impala+Presto)→ Parquet
  • 需要ACID事务 → ORC
  • 复杂嵌套结构 → Parquet