列存与格式选择
分析型事实表默认列存加压缩。ORC 在 Hive 生态成熟,压缩比高、统计信息与谓词下推完善,适合离线宽表事实;Parquet 在 Spark 生态与嵌套结构支持上更广,被 Spark、Presto、Flink 等引擎普遍读取;Avro 是行存,适合作为写入缓冲层与 schema 演化频繁的中间数据。同一分层内混用多种格式会明显增加运维与调优成本。
基本信息
| ORC | 高压缩、Hive 生态成熟 |
|---|---|
| Parquet | Spark 生态、嵌套结构支持广 |
| Avro | 行存,适合写入缓冲与 schema 演化 |
| 压缩策略 | 热数据轻压缩、冷数据高压缩 |
| 约束 | 同一分层内尽量统一格式 |
典型使用场景
- 离线事实宽表用 ORC,配合分区裁剪降低扫描量
- 多引擎读取同一份数据时选 Parquet,兼容性更好
- 含数组、结构体等嵌套字段的场景优先 Parquet
- 流式写入的缓冲层用 Avro,便于 schema 演进
- 冷数据归档时提高压缩级别,换取存储成本下降
- 同一份明细被多个引擎读取时,选型优先考虑兼容性而非压缩率
ORC 事实表
ORC 事实表
-- Hive 建 ORC 事实表,按日期分区
CREATE TABLE dwd_order (
order_id string,
user_id bigint,
amount decimal(18,2)
)
PARTITIONED BY (dt string)
STORED AS ORC
TBLPROPERTIES ('orc.compress' = 'ZLIB');
-- 压缩级别按冷热分层调整
-- 热数据优先读取速度,冷数据优先压缩率格式对照
| 格式 | 优势 | 典型场景 |
|---|---|---|
| ORC | 高压缩、统计信息完善 | Hive 离线宽表事实 |
| Parquet | 多引擎兼容、嵌套结构 | Spark 与跨引擎数据共享 |
| Avro | 行存、schema 演化友好 | 流式写入缓冲层 |
| 文本格式 | 可读、便于调试 | 小数据量接入与排查 |
小文件问题与格式同等重要:无论 ORC 还是 Parquet,单目录下大量小文件都会让元数据查询与任务启动开销成为瓶颈,需要配合分区合并一起治理。
列存的读取优势依赖列裁剪:如果查询习惯是取全列,收益会被大幅削弱,此时优化重点应转向查询习惯与表设计,而不是继续换格式。
压缩选择要结合查询模式:全表扫描多、点查少的场景优先压缩率,能省下大量存储与 IO;点查密集、延迟敏感的场景则应降低压缩级别,优先读取速度。