管道基础52 条

ORC 列式文件格式

ORC 是 Hive 生态常用的列式格式,提供列级索引、布隆过滤与谓词下推支持;在 Hive 为主、Spark 为辅的仓库里使用广泛。

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(例如每分钟一次的微批作业)会产生海量小文件,元数据与查询规划开销逐步累积,需要调大批次粒度或定期做合并,否则查询会越来越慢。

易错点

  • orc.compress 指定的压缩算法要与查询引擎兼容,换引擎前先用小数据验证读取,否则报未知 codec
  • 频繁小批量写入产生大量小文件,拖慢查询规划,应调大批次或定期合并
  • ORC 不支持单行更新,把 ORC 表当维表做高频 upsert 会导致整个分区重写
  • 在 Hive 与其他引擎间共享表数据时,若类型定义或表属性不一致,可能读出空值而不是直接报错

数据来源与参考

  • Apache ORC 官方文档:ORC Specification
  • Apache Hive LanguageManual:ORC Files
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌