01 什么是数据漂移
数据漂移指的是在数据同步过程之中,ODS表同一个业务日期包含前一天的数据或丢失了当天的数据、或者包含后一天的数据。
02 为什么会产生数据漂移
数仓ODS通常采用按时间段分区的方式存储数据,故会使用某个时间戳来区分时间段。而时间戳的选择会导致不同类型的数据漂移现象。
数据表中用来记录业务过程发生时间的时间戳字段(proc_time)
数据库日志中用来表示数据记录更新时间的时间戳字段(log_time)
数据表中用来表示数据记录更新时间的时间戳字段(modified_time)
标识数据记录被抽取到时间的时间戳字段(extract_time)
理论上,上述四个时间戳应该是一致的,即proc_time = log_time = modified_time = extract_time,但实际生产中,这几个时间往往会出现差异。
说明:
1. 业务过程:在阿里的语境中,指的是行为事件,比如注册,支付等,这些行为事件是企业核心业务活动事件。
2. proc_time 为行为事件发生的时间;log_time为数据库日志binlog时间;modified_time记录型行为事件状态更新时间,一个行为事件有多个状态,比如“待支付”,“已支付”,modified_time会进行更新和变化。
3.在现实中,四个时间戳的大小关系为:proc_time<log_time<modified_time<extract_time,造成这些差异的原因有:
1)由于数据产生后才能抽数,并且很难做到数据实时产生实时抽取,所以extract_time一般会晚于其他三个时间。
2)关系型数据库采用预写日志方式来更新数据,所以更新时间modified_time会晚于log_time。
3)由于网络或系统压力问题,会导致数据延迟写入/数据延迟更新。故log_time浩哥modified_time晚于proc_time
4) 前台业务系统手工修正数据时,未更新modified_time。
03 数据漂移的表现
分析ODS表选取不同的时间戳作为分区字段时,产生的几种数据漂移场景。
1、当选取extract_time作为分区字段时,由于extract_time晚于其他三个时间,所以会导致当天数据中包含前一天漂移过来的数据(前一天0点附近产生的数据),同时也会导致丢失当天的数据。(当天0点附近的数据漂移到后一天了)
2、当选取modified_time作为分区字段时,由于①前台业务系统手工修正数据,未及时更新modified_time或者②网络延迟导致modified_time晚于proc_time,会导致丢失当天变更的数据或包含前一天的数据。
3、选取log_time作为分区字段时,由于网络延迟等问题,同样会导致包含前一天数据或当天变更数据被丢失。
4、当选取proc_time作为分区字段时,不会产生数据漂移现象,但是违背了数仓是面向历史的特点。当以proc_time作为分区字段时,ods表只是包含业务过程发生时的记录了,获取不到业务过程后续状态的更新和变化,导致了数据准确性问题。
04 数据漂移的处理方法
1、多获取后一天的数据
在ods每个时间分区中向后躲冗余一天数据,保障数据只会多,不会少,而具体的数据切分让下游根据自身不同的业务场景用不同的业务时间proc_time来限制。但这种方式会有一些数据误差,因为后一天的数据可能已经更新多次,直接获取到的那条记录已经是更新多次后的状态了。
2、通过多个时间戳字段限制时间来获取相对准确的数据
①获取当天漂移的数据:根据modified_time获取后一天15分钟的数据,并限制多个和业务过程的时间戳为当天,然后根据这些数据按照modified_time升序排序,获取每个数据(主键唯一)首次数据变更的那条记录。
②获取当天未漂移的数据并剔除前一天漂移过来的数据:根据log_time分别冗余前一天最后15分钟的数据和后一天凌晨开始15分钟的数据,并用modified_time过滤非当天数据,并针对每个订单按照log_time进行降序排序,取每个订单当天最后一次数据变更的那条记录。
③将两部分数据根据订单做全外连接,即可得到当天所有数据。
05 总结
数据一致性校验与数据漂移是两个不同的问题,数据一致性是对比源端和目标端在数据量上的一致性,数据漂移则是根据ODS表分区字段取什么值的问题,后者在一定程度上会影响到前者。