两个时间的分工
事件时间指用户行为或业务动作真正发生的时刻,处理时间指数据到达并写入数仓的时刻。业务统计、分区归属、历史回溯都应以事件时间为基础,处理时间只作延迟监控与排障的辅助列。若按处理时间分区,一旦上游积压或重放,昨天的事件会被写进今天的分区,补数后同一历史日期对应的数据还会被动变化,追溯口径随之失效。
基本信息
| 事件时间 | 业务口径基准,分区与统计按它 |
|---|---|
| 处理时间 | 入库时刻,用于延迟监控与排障 |
| 分区策略 | 按事件时间折算的业务日切分 |
| 乱序容忍 | 迟到数据按事件时间回填历史分区 |
| 脏时间防护 | 未来时间、空时间需拦截或兜底 |
典型使用场景
- 行为、订单、支付类日粒度统计统一按事件时间归属
- 监控链路延迟:用处理时间与事件时间之差看数据到达滞后期
- 处理跨天流量:23:59 的事件算前一天,不看入库时间
- 上游重放历史数据时按事件时间回填,而不是就近写入当天分区
- 排查「昨天的数字怎么变了」,先区分是事件时间修正还是分区错位
双时间列
双时间列
-- 事件时间与处理时间同时保留,各司其职
CREATE TABLE dwd_click (
click_id string,
user_id string,
event_ts timestamp COMMENT '事件时间,业务口径基准',
proc_ts timestamp COMMENT '入仓处理时间,延迟监控用'
) PARTITIONED BY (dt string COMMENT '由 event_ts 折算的业务日')
STORED AS ORC;
-- 延迟分布:处理时间与事件时间的差值
SELECT avg(unix_timestamp(proc_ts) - unix_timestamp(event_ts)) AS lag_sec
FROM dwd_click WHERE dt = '2026-10-12';时间列读法
| 时间列 | 用途 | 用错的表现 |
|---|---|---|
| event_ts | 业务统计与分区归属 | 按处理时间分区会落到错误日期 |
| proc_ts | 延迟监控、重放排查 | 用于业务口径则追数后数字变化 |
| 未来时间 | 脏数据信号 | 不拦截会写出未来分区 |
| 空时间 | 上游漏字段 | 无兜底时整条记录被丢弃 |
事件时间缺失时要有兜底策略:可用消息时间或服务端接收时间替代并打标记,而不是直接丢弃,也不该写成处理时刻。
迟到窗口的宽度由业务容忍度决定:太窄会丢数据,太宽会让看板长期处于变动状态,通常按业务约定的小时数设定并向消费方公告。