首页/数据/数据工程与 ETL 速查/数仓表分区与分桶设计
本包目录(311 条)

数仓表分区与分桶设计

分区按日期(dt/ds)切分便于增量覆盖与裁剪,分桶按高基数列散列便于采样与连接优化;分区字段要能用等值或范围条件过滤,否则起不到裁剪作用。

分区按 dt 一级分区常见,必要时加二级(region/hour)
分桶按 user_id 等散列,桶数取 2 的幂较整齐
收益分区裁剪减少扫描,分桶提升连接与采样效率
代价小分区过多会增加存储与元数据压力

分区分桶建表

分区分桶建表
CREATE TABLE dwd_trade_order_detail_di (
  order_id BIGINT, user_id BIGINT, pay_amount DECIMAL(18,2)
)
PARTITIONED BY (dt STRING)
CLUSTERED BY (user_id) INTO 64 BUCKETS
STORED AS ORC;
查询要显式带分区条件(如 dt='2026-10-11'),否则全表扫描,分区设计等于白做。

易错点

  • 分区字段用函数包装(to_date(create_time)=...)导致无法裁剪
  • 分区粒度过细(按小时再按分钟),小文件拖垮读取性能

数据来源与参考

  • Apache Hive 官方文档:Partitioned 与 Bucketed Tables
  • 行业数仓表设计实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌