分区空洞是什么
分区表按业务日期切分后,每天(或每月)应当产出一个分区。空洞指本该存在的分区没有产出、分区存在但行数为 0、以及行数远低于历史基线的“小分区”。三者根因不同:缺失多为调度失败或依赖未就绪,空分区多为上游确实无数据或过滤条件误伤,小分区多为上游某一路数据源断流。检查要分别覆盖,结论才能直接指到责任环节。
基本信息
| 适用对象 | Hive / Spark SQL / MaxCompute / ClickHouse 等分区表 |
|---|---|
| 检查维度 | 分区是否存在、行数是否为零、是否低于基线 |
| 运行时机 | 上游链路产出完成之后,T+1 例行巡检 |
| 元数据入口 | Hive 用 SHOW PARTITIONS;MySQL/StarRocks 用 information_schema.partitions |
| 产出物 | 缺失分区清单、空分区清单、小分区清单 |
典型使用场景
- 每日例行巡检:核心链路产出后自动比对应有分区清单,第一时间发现漏跑
- 调度故障复盘:任务失败后确认历史空洞是否随重跑被补齐
- 新链路验收:上线前核对近 30 天分区完整性,暴露长期静默缺失
- 变更后回归:过滤条件或上游口径调整后,确认没有产生新的空分区
- 月度对账前体检:把跨月分区缺失一次性列清,避免对账当天才发现少数据
缺失分区检测
缺失分区检测
-- expected_dates:该表应存在的分区日期清单,由调度日历或历史分区生成
SELECT expect.dt
FROM expected_dates expect
LEFT JOIN (SELECT DISTINCT dt FROM dwd_trade_order_di) actual -- 实际已有分区
ON expect.dt = actual.dt
WHERE actual.dt IS NULL -- 实际缺失
AND expect.dt <= '2026-10-11'; -- 排除当天,尚未产出属正常空分区与小分区
空分区与小分区
-- 用近 7 天行数均值作基线,与待检查分区对比
WITH base AS (
SELECT dt, COUNT(*) AS rows_cnt
FROM dwd_trade_order_di
WHERE dt BETWEEN '2026-10-04' AND '2026-10-10'
GROUP BY dt
),
today AS (
SELECT COUNT(*) AS rows_cnt
FROM dwd_trade_order_di
WHERE dt = '2026-10-11'
)
SELECT today.rows_cnt AS today_cnt,
(SELECT AVG(rows_cnt) FROM base) AS base_avg
FROM today
WHERE today.rows_cnt = 0 -- 空分区
OR today.rows_cnt < 0.3 * (SELECT AVG(rows_cnt) FROM base); -- 小分区三类分区问题对照
| 现象 | 常见根因 | 处置动作 |
|---|---|---|
| 应有分区缺失 | 上游任务失败、依赖未就绪、调度被跳过 | 查上游实例状态,补数后重跑本分区 |
| 分区存在但行数为 0 | 上游确实无数据、过滤条件误伤 | 核对上游分区行数,确认是业务空跑还是条件写错 |
| 行数远低于基线 | 上游某一路数据源断流、同步部分失败 | 按数据源拆分核对,定位断流的那一路 |
小分区阈值要叠加业务日历:周末与节假日的正常回落不应被当成故障。
判断分区是否存在优先读元数据:Hive 用 SHOW PARTITIONS,MySQL/StarRocks 类可用 information_schema.partitions,比扫描数据本身便宜得多。