Hive ORC与Parquet格式对比
请比较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