概念
数据漂移是 ODS 数据的一个顽疾,通常是指 ODS
表的同一个业务日期数据中包含前一天凌晨附近的数据或者丢失当天的变更数据。
案例
落地到ODS的数据需要按日切分,但是有很多时间戳字段,以哪个为准好呢?
通常,时间戳字段分为四类:
数据库表中用来标识数据记录更新时间的时间戳字段(假设这类字段叫 modified time )。
数据库日志中用来标识数据记录更新时间的时间戳字段·(假设这类宇段叫 log_time)。
数据库表中用来记录具体业务过程发生时间的时间戳字段 (假设这类字段叫 proc_time)。
标识数据记录被抽取到时间的时间戳字段(假设这类字段extract time)。
这几个时间理论上应该一样,但是由于如下等原因,会出现差距
由于数据抽取是需要时间的, extract_time 往往会晚于前三个时间。
前台业务系统手工订正数据时未更新 modified_time
由于网络或者系统压力问题, log_time 或者 modified_time 会晚proc_time。
解决方式
多获取后天的数据
最常用的处理方法是在ODS表每个时间分区中向前、后多冗余一些数据,保障数据只多不少,具体应用的时候可以让下游的表根据自身业务需要用不同的proc_time去做筛选处理。
当然这种方式对累积快照事实表是有一些统计风险的,例如一个订单是当天支付的,但是第二天凌晨申请退款关闭了,那么当这个订单离线同步到ODS时,记录该订单的记录只会保留最终的订单状态。那么统计当天订单数量时会出现错误。