首页/数据/数仓建模速查/事实表存储格式选择
维度与事实设计149 条

事实表存储格式选择

列存 + 压缩(ORC/Parquet)是分析事实表默认;ORC 在 Hive 生态压缩与谓词下推成熟,Parquet 在 Spark 生态与嵌套结构支持广。

数仓建模速查数据更新于 2026-10-13

列存与格式选择

分析型事实表默认列存加压缩。ORC 在 Hive 生态成熟,压缩比高、统计信息与谓词下推完善,适合离线宽表事实;Parquet 在 Spark 生态与嵌套结构支持上更广,被 Spark、Presto、Flink 等引擎普遍读取;Avro 是行存,适合作为写入缓冲层与 schema 演化频繁的中间数据。同一分层内混用多种格式会明显增加运维与调优成本。

基本信息

ORC高压缩、Hive 生态成熟
ParquetSpark 生态、嵌套结构支持广
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;点查密集、延迟敏感的场景则应降低压缩级别,优先读取速度。

易错点

  • 同一分层混用多种格式,运维与优化复杂,新人上手慢
  • 用行存格式存分析事实表,扫描成本高、查询变慢
  • 压缩级别一律拉到最高,热数据读取延迟上升
  • 小文件长期不治理,格式再好也抵不过元数据开销

数据来源与参考

  • Hive 语言手册:存储格式;Parquet 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌