首页/数据/数仓建模速查/事件时间与处理时间的边界
维度与事实设计149 条

事件时间与处理时间的边界

业务统计用事件时间(用户何时发生),运维监控用处理时间(何时到达);分区与回溯一致性依赖事件时间,处理时间仅作辅助列。

数仓建模速查数据更新于 2026-10-13

两个时间的分工

事件时间指用户行为或业务动作真正发生的时刻,处理时间指数据到达并写入数仓的时刻。业务统计、分区归属、历史回溯都应以事件时间为基础,处理时间只作延迟监控与排障的辅助列。若按处理时间分区,一旦上游积压或重放,昨天的事件会被写进今天的分区,补数后同一历史日期对应的数据还会被动变化,追溯口径随之失效。

基本信息

事件时间业务口径基准,分区与统计按它
处理时间入库时刻,用于延迟监控与排障
分区策略按事件时间折算的业务日切分
乱序容忍迟到数据按事件时间回填历史分区
脏时间防护未来时间、空时间需拦截或兜底

典型使用场景

  • 行为、订单、支付类日粒度统计统一按事件时间归属
  • 监控链路延迟:用处理时间与事件时间之差看数据到达滞后期
  • 处理跨天流量: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延迟监控、重放排查用于业务口径则追数后数字变化
未来时间脏数据信号不拦截会写出未来分区
空时间上游漏字段无兜底时整条记录被丢弃
事件时间缺失时要有兜底策略:可用消息时间或服务端接收时间替代并打标记,而不是直接丢弃,也不该写成处理时刻。
迟到窗口的宽度由业务容忍度决定:太窄会丢数据,太宽会让看板长期处于变动状态,通常按业务约定的小时数设定并向消费方公告。

易错点

  • 按处理时间分区,追数后历史分区被动变化,口径不可复现
  • 事件时间不做未来时间校验,脏时间写入未来分区
  • 只保留一个时间列,延迟问题与口径问题混在一起无法区分
  • 迟到数据直接丢弃,日汇总与月度累计长期对不上

数据来源与参考

  • 流处理实践:事件时间语义
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌