首页/数据/数据工程与 ETL 速查/分区空洞与空分区检查

分区空洞与空分区检查

分区检查覆盖三类问题:应有分区缺失、分区存在但行数为 0、行数远低于基线的“小分区”;分别对应调度失败、上游确实无数据、过滤条件误伤等原因,检查结果按链路汇总到值班看板。

分区空洞是什么

分区表按业务日期切分后,每天(或每月)应当产出一个分区。空洞指本该存在的分区没有产出、分区存在但行数为 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,比扫描数据本身便宜得多。

易错点

  • 只盯最新分区,中间历史分区缺失长期无人发现:巡检范围要覆盖最近 30~90 天,而不是只查昨天
  • 把节假日正常低量报成故障,值班对告警逐渐麻木:小分区阈值要叠加业务日历后再判定
  • 用 COUNT(*) 判断空分区在大表上代价高:优先读元数据的行数统计或分区统计信息
  • 补数只补最新分区、不回溯依赖它的下游快照,导致下游分区依然是空壳

数据来源与参考

  • 行业数仓运维实践(分区校验)
  • Apache Spark 官方文档(分区表)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌