Hive 支持多种存储格式和压缩方式,它们可以独立配置,通过合理组合可以显著提升查询性能和存储效率。
✅ 一、Hive 存储格式
1. TEXTFILE(默认格式)
CREATE TABLE text_table (
id STRING,
name STRING
)
STORED AS TEXTFILE;
- 特点:纯文本,行存
- 优点:兼容性好,便于查看
- 缺点:无压缩,查询性能差
- 适用:数据导入导出、临时表
2. SEQUENCEFILE
CREATE TABLE seq_table (
id STRING,
name STRING
)
STORED AS SEQUENCEFILE;
- 特点:二进制格式,键值对存储
- 优点:支持压缩,适合 MapReduce
- 缺点:Hive 优化有限
- 适用:MapReduce 作业中间结果
3. RCFILE(Record Columnar File)
CREATE TABLE rcfile_table (
id STRING,
name STRING
)
STORED AS RCFILE;
- 特点:行列混合存储
- 优点:压缩率较好,查询性能优于 TEXTFILE
- 缺点:写性能差,已被 ORC 替代
- 适用:已过时,不推荐
4. ORC(Optimized Row Columnar)
CREATE TABLE orc_table (
id STRING,
name STRING
)
STORED AS ORC
TBLPROPERTIES (
"orc.compress"="ZSTD",
"orc.create.index"="true"
);
- 特点:列式存储,专为 Hive 优化
- 优点:
- ✅ 高压缩比
- ✅ 内置索引(Bloom Filter、统计信息)
- ✅ 支持谓词下推
- ✅ 向量化执行
- 适用:推荐用于分析场景
5. PARQUET
CREATE TABLE parquet_table (
id STRING,
name STRING
)
STORED AS PARQUET
TBLPROPERTIES (
"parquet.compression"="SNAPPY"
);
- 特点:列式存储,跨平台支持
- 优点:
- ✅ 高压缩比
- ✅ 支持复杂嵌套类型
- ✅ 与 Spark、Presto 等兼容性好
- 适用:推荐用于跨引擎场景
6. AVRO
CREATE TABLE avro_table (
id STRING,
name STRING
)
STORED AS AVRO
TBLPROPERTIES (
'avro.schema.literal'='{
"type": "record",
"name": "test",
"fields": [
{"name":"id", "type":"string"},
{"name":"name", "type":"string"}
]
}'
);
- 特点:支持 Schema 演化
- 优点:Schema 兼容性好,适合流式数据
- 适用:Kafka 流式数据存储
✅ 二、Hive 压缩方式
1. GZIP
SET hive.exec.compress.output=true;
SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec;
- 压缩比:高(约 3:1)
- 速度:压缩慢,解压中等
- 切分:不支持(影响并行度)
2. BZIP2
SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;
- 压缩比:最高(约 4:1)
- 速度:压缩解压都很慢
- 切分:支持
3. SNAPPY
SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
- 压缩比:中等(约 2:1)
- 速度:压缩解压都很快
- 切分:不支持
4. LZO
SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec;
5. ZSTD(Zstandard)
SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.ZStandardCodec;
- 压缩比:高(接近 GZIP)
- 速度:压缩解压都快
- 切分:不支持
✅ 三、存储格式 + 压缩方式的最佳实践
1. 分析场景(推荐)
CREATE TABLE analytics_table (
user_id STRING,
action STRING,
ts TIMESTAMP
)
PARTITIONED BY (dt STRING)
STORED AS ORC
TBLPROPERTIES (
"orc.compress"="ZSTD",
"orc.create.index"="true",
"orc.bloom.filter.columns"="user_id"
);
2. 跨引擎场景
CREATE TABLE cross_engine_table (
user_id STRING,
action STRING
)
STORED AS PARQUET
TBLPROPERTIES (
"parquet.compression"="SNAPPY"
);
3. 日志场景
CREATE TABLE log_table (
log_time TIMESTAMP,
user_id STRING,
action STRING
)
PARTITIONED BY (dt STRING, hour STRING)
STORED AS ORC
TBLPROPERTIES (
"orc.compress"="SNAPPY",
"orc.stripe.size"="67108864"
);
✅ 四、性能对比总结
| 存储格式 | 压缩比 | 查询性能 | 写入性能 | 适用场景 |
|---|
| TEXTFILE | 低 | 差 | 好 | 临时表 |
| ORC | ✅ 高 | ✅ 优秀 | 好 | 推荐分析 |
| PARQUET | ✅ 高 | ✅ 优秀 | 好 | 推荐跨引擎 |
| SEQUENCEFILE | 中 | 中 | 中 | MapReduce 中间结果 |
| 压缩方式 | 压缩比 | 压缩速度 | 解压速度 | 切分支持 |
|---|
| SNAPPY | 中 | ✅ 快 | ✅ 快 | ❌ |
| ZSTD | ✅ 高 | ✅ 快 | ✅ 快 | ❌ |
| GZIP | ✅ 高 | 慢 | 中 | ❌ |
| BZIP2 | 最高 | 很慢 | 很慢 | ✅ |
✅ 五、配置建议
1. 全局压缩设置
SET hive.exec.compress.output=true;
SET hive.exec.compress.intermediate=true;
SET hive.vectorized.execution.enabled=true;
2. 文件合并优化
SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.merge.size.per.task=256000000;
📌 总结
| 推荐场景 | 存储格式 | 压缩方式 | 理由 |
|---|
| 数据分析 | ORC | ZSTD/SNAPPY | 最优性能 |
| 跨引擎 | PARQUET | SNAPPY | 兼容性好 |
| 日志存储 | ORC | SNAPPY | 查询快 |
💡 核心建议:ORC + ZSTD/SNAPPY 是 Hive 分析场景的黄金组合,PARQUET + SNAPPY 适合跨引擎场景。选择时需平衡压缩比、查询性能、存储成本三个维度。