Hive/数仓里分区和分桶的区别是什么?怎么用?
分区分桶性能
考察意图
仓表设计基础。考察剪枝、文件布局与 join 优化直觉。
回答框架
- 分区:目录级隔离,利好过滤剪枝。
- 分桶:哈希打散到固定文件,利好抽样/桶 join。
- 实践:时间分区几乎标配;分桶慎用、看引擎。
参考答案(口述版)
分区(Partition):按列把数据分成目录(如 dt、country)。查询带分区条件时可分区剪枝,少读大量无关数据。几乎所有事实表都会按日期分区。
分桶(Bucket):对某列哈希,把数据切成固定数量文件。好处包括:更均匀的文件布局、高效抽样、某些引擎上的 bucket map join。代价是写入更严(要满足桶规则),且现代云仓未必强调 Hive 式分桶。
实践建议:
- 必做:合理时间分区 + 避免小文件过多
- 可选:高基数字段不要滥作分区(爆炸);热点过滤维度可作二级分区但控制基数
- 分桶:仅在明确有桶 join/抽样需求且平台支持良好时使用
回答加分:提到动态分区、分区过多导致 NameNode/元数据压力。
关键词
分区剪枝小文件分桶哈希元数据
面试官可能的追问
追问 1:为什么不建议用 user_id 做分区?
基数过高导致海量小目录/小文件,元数据与调度崩溃;过滤剪枝收益也不划算。应用分桶或排序/聚簇类技术(视平台)。
常见踩坑
- 分区字段选太细造成分区爆炸
- 查询忘记带分区条件导致全表扫
记忆锚点
分区为了少读;分桶为了打散与特定优化——日期分区优先。