ORC 是什么
ORC(Optimized Row Columnar)是 Hive 生态里的列式存储格式,由 Hive 社区从 RCFile 演进而来。它按列存储数据,并在文件内部维护行组级统计(每列 min/max)和布隆过滤器等索引,让查询在真正读取数据前就能跳过大量无关内容。在 Hive 为主、Spark 为辅的离线仓库中 ORC 是事实上的默认选择;湖仓一体化场景因为多引擎兼容性,Parquet 也很常见。
基本信息
| 适用平台 | Hive 0.11+ / Spark / Presto(Trino),存储为 HDFS、S3 等 |
|---|---|
| 建表方式 | STORED AS ORC,压缩等参数写 TBLPROPERTIES |
| 核心能力 | 列裁剪、谓词下推、行组索引、布隆过滤 |
| 不适用 | 逐行更新与高频 upsert,行存或湖表格式更合适 |
典型使用场景
- 离线数仓明细层与汇总层建表:只读少数几列时列存 I/O 远小于文本格式
- Hive 报表与大宽表查询:行组统计让过滤条件命中率高的查询显著变快
- 历史数据归档:ORC 压缩后存储成本低,适合长期保留的分区
- 数据探查与统计:列级统计让 count/distinct 类探查少扫数据
- 与 Presto/Trino 混读同一份表:需先确认两端支持的压缩算法一致
Hive 建 ORC 表并写入
Hive 建 ORC 表并写入
CREATE TABLE dwd_order_orc ( -- 明细表:订单号、金额、下单时间
order_id STRING, amount DECIMAL(10,2), created_at TIMESTAMP
) PARTITIONED BY (dt STRING) -- 按天分区,查询可做分区裁剪
STORED AS ORC
TBLPROPERTIES ('orc.compress' = 'ZLIB'); -- 压缩算法在表属性里指定
INSERT OVERWRITE TABLE dwd_order_orc PARTITION (dt='2026-10-12')
SELECT order_id, amount, created_at FROM ods_order WHERE dt='2026-10-12';ORC 关键概念与读法
| 概念 | 含义 | 实践含义 |
|---|---|---|
| stripe 行组 | 默认约 64MB 的数据块 | 大小影响单次 I/O 与读取并行度 |
| row index 行索引 | 每列在每个 stripe 内按万行记录 min/max | 过滤命中时整段数据可跳过 |
| 布隆过滤器 | 列值集合的位图结构 | 对高基数等值过滤有效,占额外空间 |
| footer 文件尾 | schema 与全文件统计信息 | 读文件必读 footer,小文件多时开销明显 |
| 小文件 | 每个写任务产出一个文件 | 文件数过多拖慢规划与元数据服务 |
ORC 与 Parquet 都是成熟列存格式,选型更多取决于引擎生态与团队既有规范,而不是单点性能;同一仓库混用两种格式时,要确认下游所有引擎都能读,避免只在某个引擎上能跑。
小批量频繁写 ORC(例如每分钟一次的微批作业)会产生海量小文件,元数据与查询规划开销逐步累积,需要调大批次粒度或定期做合并,否则查询会越来越慢。