ORC 与 Parquet 是什么
ORC 与 Parquet 都是列式存储格式:数据按列分块,每块带最小值最大值等统计信息,查询只读用到的列并能跳过不匹配的数据块,所以列裁剪与块级过滤是它们相对文本格式的核心优势。ORC 来自 Hive 生态,stripe 级索引与统计信息较细,Hive 的事务表只能用它;Parquet 源自 Dremel 模型,嵌套结构表达更通用,在 Spark 生态与主流湖表格式里更常见。选型主要看现有引擎栈,同集群内统一一种格式能省掉大量兼容问题。
基本信息
| 适用平台 | Hive、Spark、Trino/Presto、Impala,以及 Iceberg、Delta、Hudi 等湖表 |
|---|---|
| ORC 特点 | stripe 级统计与索引详细,Hive 生态原生,支持 ACID 事务表 |
| Parquet 特点 | 嵌套结构表达通用,Spark 生态与湖表引用广 |
| 压缩选项 | ORC 支持 ZLIB、SNAPPY、ZSTD;Parquet 支持 SNAPPY、GZIP、ZSTD |
| 文件大小 | 与 HDFS 块大小接近时比较理想,常见 128-256MB |
| 统计信息 | 决定过滤时能否跳过数据块,写入时不宜关闭 |
| 迁移成本 | 换格式要重写历史数据并确认下游读取方式 |
典型使用场景
- 以 Hive 为主的离线数仓选 ORC:事务表、更新删除能力都依赖它
- 以 Spark 为主的加工链路选 Parquet:兼容性好,生态里默认支持最广
- 湖表读写通常用 Parquet:Iceberg 与 Delta 的默认文件格式就是它
- 需要表达数组、结构体等嵌套字段时,Parquet 的写法更直观,多引擎支持也更一致
- 存储成本敏感的场景选 ZSTD 压缩,在压缩比与解压速度之间取平衡
两种格式建表
两种格式建表
CREATE TABLE dwd_trade_order_di ( -- ORC:Hive 生态主推
order_id STRING COMMENT '订单号',
pay_amt DECIMAL(18,2) COMMENT '支付金额'
)
PARTITIONED BY (dt STRING)
STORED AS ORC
TBLPROPERTIES ('orc.compress' = 'ZSTD'); -- 压缩算法按 CPU 与存储成本权衡
CREATE TABLE dwd_trade_order_pq ( -- Parquet:Spark 与湖表常用
order_id STRING COMMENT '订单号',
pay_amt DECIMAL(18,2) COMMENT '支付金额'
)
PARTITIONED BY (dt STRING)
STORED AS PARQUET
TBLPROPERTIES ('parquet.compression' = 'SNAPPY');
DESCRIBE FORMATTED dwd_trade_order_di; -- 查看实际使用的读写格式两种格式逐项对照
| 维度 | ORC | Parquet |
|---|---|---|
| 生态来源 | Hive 生态原生 | Dremel 模型,Spark 与湖表常用 |
| 索引与统计 | stripe 级统计与索引较细 | 以行组统计为主 |
| 复杂类型 | 支持,表达偏 Hive 风格 | 嵌套表达更通用 |
| Hive 事务表 | 支持 | 不支持 |
| 压缩选项 | ZLIB、SNAPPY、ZSTD | SNAPPY、GZIP、ZSTD |
列式存储的收益来自列裁剪与块级过滤,前提是统计信息完整。频繁追加的小文件既让块级过滤失效,又增加文件调度开销,写完后安排合并是常规动作。
表的数据格式由建表语句固定。目录里混入另一种格式的文件,读取时通常报错或读到空值,且从表结构上完全看不出来。