在 Hive 中,文件存储格式(File Format) 和 压缩算法(Compression Codec) 是影响查询性能、存储成本和 I/O 效率的关键因素。合理选择二者组合,可显著提升数仓整体效能。
✅ 一、Hive 常见文件存储格式
| 格式 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| TEXTFILE | 行存 | 默认格式,纯文本,可读性强 | 日志原始数据、临时分析 |
| SEQUENCEFILE | 行存 | 二进制、支持压缩、可分割 | 已淘汰,基本不用 |
| RCFILE | 混合 | 先按行分块,再按列存储(早期列存) | 老系统兼容,新项目不推荐 |
| ORC | 列存 | 高效压缩 + 谓词下推 + 索引 + ACID 支持 | ✅ Hive 首选(推荐) |
| Parquet | 列存 | 跨引擎兼容(Spark/Presto/Impala)、嵌套结构支持好 | 多引擎共享场景 |
🔍 核心对比(ORC vs Parquet)
| 特性 | ORC | Parquet |
|---|---|---|
| Hive 原生优化 | ✅ 极佳(LLAP、向量化) | 良好 |
| 压缩率 | 更高(轻量级编码 + ZSTD) | 高 |
| 谓词下推 | 支持(含布隆过滤器) | 支持 |
| ACID 事务 | ✅ 支持(Hive 3.0+) | ❌ 不支持 |
| 跨引擎兼容性 | 一般(主要 Hive) | ✅ 极佳(Spark/Presto/Flink) |
| 复杂类型 | 支持 | ✅ 更好(struct/map/array) |
📌 建议:
- 纯 Hive 数仓 → 用 ORC;
- 多引擎(Spark + Hive + Presto)→ 用 Parquet。
✅ 二、常用压缩算法(Codec)
Hive 支持多种压缩,需与存储格式配合使用:
| 压缩算法 | 是否可分割 | 压缩率 | 速度 | Hive 支持情况 |
|---|---|---|---|---|
| None | ✅ | 低 | 快 | 默认 |
| Gzip | ❌ | 高 | 中 | 支持,但不可分割 |
| BZip2 | ✅ | 很高 | 慢 | 支持,少用 |
| Snappy | ✅ | 中 | 极快 | ✅ 最常用 |
| LZO | ✅(需建索引) | 中 | 快 | 需额外配置 |
| ZSTD | ✅ | 极高 | 快 | Hive 3.0+ 推荐(ORC 默认) |
⚠️ 关键注意:
- 可分割(Splittable):决定 MapTask 能否并行读取。
→ Gzip 不可分割,大文件会导致单 MapTask,慎用! - ORC 内置压缩:无需额外指定 codec,直接设
TBLPROPERTIES ("orc.compress"="ZSTD")。 - TEXTFILE/Parquet:需显式设置压缩:
SET hive.exec.compress.output=true; SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
✅ 三、最佳实践组合推荐
| 场景 | 存储格式 | 压缩算法 | 说明 |
|---|---|---|---|
| Hive 数仓生产表 | ORC | ZSTD 或 Snappy | 高压缩 + 高性能 + 谓词下推 |
| 多引擎共享表 | Parquet | Snappy | 兼容性好,读写快 |
| 原始日志(ODS) | TEXTFILE | Snappy(或 LZO) | 可读 + 可分割 |
| 中间临时表 | ORC | Snappy | 快速处理,节省空间 |
示例:创建高性能 ORC 表
CREATE TABLE dwd_user_behavior (
user_id STRING,
event STRING,
ts BIGINT
)
PARTITIONED BY (dt STRING)
STORED AS ORC
TBLPROPERTIES (
"orc.compress" = "ZSTD",
"orc.create.index" = "true",
"orc.bloom.filter.columns" = "user_id"
);
✅ 四、如何验证压缩与格式生效?
-- 查看表结构
DESCRIBE FORMATTED dwd_user_behavior;
-- 查看 HDFS 文件大小
hdfs dfs -du -h /user/hive/warehouse/db.db/dwd_user_behavior/dt=20241106
若文件后缀为
.snappy或.zst,且体积远小于原始数据,则成功。
📌 面试总结(一句话)
Hive 生产环境首选 ORC + ZSTD/Snappy:列存格式支持谓词下推和高效压缩,ZSTD 提供极致压缩率,Snappy 保证速度;若需多引擎兼容,则选 Parquet + Snappy。避免使用不可分割的 Gzip,尤其对大文件。
这是数仓性能调优的基础,直接影响存储成本与查询效率。

被折叠的 条评论
为什么被折叠?



