一、前言
最近在ETL工作中遇到了一些数据漂移的问题,写在这里权当做一个记录以及自己的一些思考。
二、什么是数据漂移
通常我们把从源系统同步进入数据仓库的第一层数据成为ODS层,数据漂移是一个很容易发生的现象。通常指ODS的表在同一个业务日期数据中包含前一天或者后一天凌晨附近的数据或者丢失当天的变更数据。
在大数据领域有另外一个东西名字很相近,叫数据倾斜。当然他们完全不是一码事,关于数据倾斜的问题,如果我不偷懒的话会在不远的将来也写一篇博客阐述一番我的理解。
三、我们遇到了什么问题
ODS层往往承接了面向历史的细节数据查询需求,为了查询性能落地到ODS层的数据需要进行切分存储,通常是按照时间维度–天来切分,实际上就是这个时间字段的准确性导致的数据漂移。
实际场景
公司主营短信业务,因此有了一张数据量庞大的短信记录表,这张表按照客户的发送时间来切分分区,字段为smt
。实际上这张表里的时间字段非常多,因为整个业务场景就涉及到好几段流程,大概总结为:
客户提交短信请求 → 我们接受请求 → 路由寻找合适的通道 → 提交给运营商 → 运营商返回结果报告 → 匹配发送记录和返回报告 → 反馈给客户发送结果
可以想见,每一段子流程里都会有相应的时间字段。 选择使用客户的提交时间来做分区字段,也是为了贴近客户的实际体验。即某一天的短信记录明细就应该是客户提交给我们的那一天的所有短信。
实际上并不是这样,主要有两种场景导致了异样的发生:
1、通道延迟
我们接受到客户的短信请求后,到提交给运营商这段时间理论上是很