分区 DDL 能做什么
Hive 的分区元数据由 Metastore 维护,数据落在 dt=值 形式的目录里,两者必须一致。有三种手段对齐:ALTER TABLE ADD PARTITION 手工登记单个或批量分区并指定 LOCATION;MSCK REPAIR TABLE 扫描目录结构把缺失的分区一次性补进元数据;ALTER TABLE DROP PARTITION 删除分区。修复失败绝大多数来自目录命名不符合分区列的 dt=值 结构,此时 MSCK 识别不到,只能逐个 ADD PARTITION 补齐。
基本信息
| 添加分区 | ALTER TABLE t ADD IF NOT EXISTS PARTITION (dt='2026-10-12') LOCATION '路径' |
|---|---|
| 修复分区 | MSCK REPAIR TABLE t,按 dt=值 的目录结构补齐元数据 |
| 删除分区 | ALTER TABLE t DROP IF EXISTS PARTITION (dt='2026-09-01') |
| 查看分区 | SHOW PARTITIONS t |
| 目录结构要求 | 表路径下按分区列名等于值命名,如 dt=2026-10-12 |
| 性能提示 | 分区数量很大时 MSCK 耗时明显,用批量 ADD PARTITION 更可控 |
| 风险提示 | 删除分区通常连带删除目录中的数据,外部表在旧版本上同样如此,执行前确认版本行为 |
典型使用场景
- 初始化历史数据:目录已经就位,用 ADD PARTITION 把分区逐个登记进元数据
- 外部目录挂载:ADD PARTITION 时用 LOCATION 指定表默认路径之外的目录
- 批量对齐:采集程序持续新增目录,用 MSCK 一次性修复缺失的分区
- 释放存储:清理过期分区,同时删除元数据与数据目录
- 核对一致性:把 SHOW PARTITIONS 的结果与目录列表比对,找出只在一边存在的分区
分区管理常用命令
分区管理常用命令
-- 手工添加分区,外部目录时显式指定 LOCATION
ALTER TABLE ods_order ADD IF NOT EXISTS PARTITION (dt='2026-10-12')
LOCATION '/warehouse/ods/order/dt=2026-10-12';
-- 按目录结构批量修复分区元数据
MSCK REPAIR TABLE ods_order;
-- 查看当前已登记的分区
SHOW PARTITIONS ods_order;
-- 清理过期分区:注意分区目录中的数据会一并删除
ALTER TABLE ods_order DROP IF EXISTS PARTITION (dt='2026-09-01');分区操作对照
| 操作 | 命令 | 影响范围 |
|---|---|---|
| 添加分区 | ALTER TABLE ... ADD PARTITION | 只写元数据,可指定 LOCATION |
| 批量修复 | MSCK REPAIR TABLE | 扫描目录补齐缺失分区元数据 |
| 删除分区 | ALTER TABLE ... DROP PARTITION | 元数据通常连带数据目录 |
| 查看分区 | SHOW PARTITIONS | 只读,用于核对 |
| 改指向 | ALTER TABLE ... PARTITION SET LOCATION | 调整分区对应的目录 |
MSCK 在分区数量多时执行慢,而且只认标准目录结构。目录里混有临时目录或命名不规范时,会修出大量空分区,反而不如按目录清单批量 ADD PARTITION。
删除分区通常会把分区目录里的数据一起删掉,外部表在旧版本上也不例外。清理历史分区前先确认版本行为,必要时先把目录挪到归档路径再删元数据。