两个时间概念的区别
数据日期(业务日期)是这条数据属于哪一天,由调度参数注入,例如 bizdate=2026-10-12;运行时间是任务实际执行的时刻,来自系统时钟,只用于日志与监控。T+1 链路里两者天然差一天:10 月 13 日凌晨跑的任务处理的是 10 月 12 日的数据。分区取值、数据过滤、口径判断一律用数据日期,用运行时间推导日期会让补数与跨零点任务写进错误分区,而且往往不报错。
基本信息
| 数据日期 | 由调度参数注入,如 bizdate=2026-10-12 |
|---|---|
| 运行时间 | 任务实际执行时刻,仅用于日志与监控 |
| 分区取值 | 一律使用数据日期参数 |
| 脚本写法 | 显式引用平台参数,不使用系统当前时间函数 |
| 跨零点风险 | 凌晨执行时当前日期与数据日期相差一天 |
| 补数方式 | 改调度参数重跑,脚本本身不改代码 |
| 传递约定 | 上下游通过调度参数传数据日期,不各自推算 |
典型使用场景
- T+1 链路:凌晨调度处理前一天数据,分区写入前一日的 dt
- 补数重跑:把调度参数改成历史日期,同一份脚本直接重放
- 跨零点长任务:运行时间已经进入第二天,数据日期仍是前一天
- 多级依赖:下游直接使用上游传入的数据日期,不再自行计算一次
- 故障排查:用运行时间定位日志与资源曲线,用数据日期定位数据范围
参数化脚本写法
参数化脚本写法
-- 调度参数由平台注入,示例值 bizdate=2026-10-12
-- 分区与过滤一律使用数据日期参数
INSERT OVERWRITE TABLE dws_trade_store_day PARTITION (dt='${bizdate}')
SELECT store_id, order_cnt, pay_amt
FROM tmp_trade_store_day;
-- 错误写法:用系统当前日期做分区,跨零点与补数都会写错日期
-- INSERT OVERWRITE TABLE dws_trade_store_day PARTITION (dt=date_format(current_date(), 'yyyy-MM-dd'))
-- 校验:确认写入分区与数据日期一致
SELECT count(*) FROM dws_trade_store_day WHERE dt = '${bizdate}';三个时间概念对照
| 概念 | 来源 | 示例值 | 用途 |
|---|---|---|---|
| 数据日期 | 调度参数注入 | 2026-10-12 | 分区、过滤、口径 |
| 运行时间 | 系统时钟 | 2026-10-13 02:30 | 日志、监控、性能分析 |
| 计划调度时间 | 调度系统计划 | 2026-10-13 00:00 | 任务定位与依赖排查 |
用系统当前日期做分区,补数时会把三天前的数据全部写进今天的分区,跨零点任务也会偏一天。写错的分区通常仍有正常数据,靠人眼很难发现。
数据日期与运行时间不一致是正常状态,不是异常。凡是与数据内容相关的判断(分区、增量范围、对账日期)都必须取数据日期;只有日志、告警与资源监控才用运行时间。