对数据漂移处理的一点理解

《大数据之路》一书中对数据漂移的处理是这么说的:

数据漂移的处理

通常我们把从源系统同步进人数据仓库的第一层数据称为 ODS或者staging 层数据,阿里巴巴统称为 ODS 。数据漂移是 ODS 数据的一个顽疾,通常是指 ODS 表的同一个业务日期数据中包含前一天或后凌晨附近的数据或者丢失当天的变更数据。

由于 ODS 需要承接面向历史的细节数据查询需求,这就需要物理落地到数据仓库的 ODS 表按时间段来切分进行分区存储 ,通常的做法是按某些时间戳字段来切分,而实际上往往由于时间戳字段的准确性问题导致发生数据漂移。

通常,时间戳字段分为四类:

  • 数据库表中用来标识数据记录更新时间的时间戳字段(假设这类字段叫 modified time )。
  • 数据库日志中用来标识数据记录更新时间的时间戳字段·(假设这类宇段叫 log_time)。
  • 数据库表中用来记录具体业务过程发生时间的时间戳字段 (假设这类字段叫 proc_time)。
  • 标识数据记录被抽取到时间的时间戳字段(假设这类字段extract time)。

理论上,这几个时间应该是 致的,但是在实际生产中,这几个时间往往会出现差异,可能的原因有以下几点:

  • 由于数据抽取是需要时间的, extract_time 往往会晚于前三个时间。
  • 前台业务系统手工订正数据时未更新 modified_time
  • 由于网络或者系统压力问题, log_time 或者 modified_time 会晚proc_time。

通常的做法是根据其中的某 个字段来切分 ODS 表,这就导致产生数据漂移。下面我们来具体看下数据漂移的几种场景。

  • 根据 extract_time 来获取数据。这种情况数据漂移的问题最明显
  • 根据 modified_time 限制。在实际生产中这种情况最常见,但是往往会发生不更新 modified time 而导致的数据遗漏,或者凌晨时间产生的数据记录漂移到后天。根据 log_time 限制。由于网络或者系统压力问题, log_time 会晚proc_time ,从而导致凌晨时间产生的数据记录漂移到后一天。
    例如,在淘宝“双 11 ”大促期间凌晨时间产生的数据量非常大,用户支付需要调用多个接口,从而导致 log time 晚于实际的支付时间。
  • 根据 proc_time 限制。仅仅根据 proc_time 限制,我们所获取的ODS 表只是包含一个业务过程所产生的记 ,会遗漏很多其他过程的变化记录,这违背了 ODS 和业务系统保持 致的设计原则。

处理方法主要有以下两种:
( 1)多获取后 天的数据既然很难解决数据漂移的问题,那么就在 ODS 每个时间分区中向前、向后多冗余 些数据,保障数据只会多不会少,而具体的数据切分让下游根据自身不同的业务场景用不同的业务时间 proc time 来限制但是这种方式会有一些数据误差,例如 个订单是当天支付的,但是第天凌晨申请退款关闭了该订单,那么这条记录的订单状态会被更新,下游在统计支付订单状态时会出现错误。
( 2)通过多个时间戳字段限制时间来获取相对准确的数据

  • 首先根据 log_time 分别冗余前一天最后 15 分钟的数据和后一天凌晨开始 15 分钟的数据,并用 modified time 过滤非当天数据,
    确保数据不会因为系统问题而遗漏。
  • 然后根据 log_time 获取后一天 15 分钟的数据 针对此数据,按照主键根据 log_time 做升序排列去重。因为我们需要获取的是最
    接近当天记录变化的数据(数据库日志将保留所有变化的数据,但是落地到 DS 表的是根据主键去重获取最后状态变化的数据)。
  • 最后将前两步的结果数据做全外连接,通过限制业务时间proc_time 来获取我们所需要的数据。

下面来看处理淘宝交易订单的数据漂移的实际案例。
我们在处理“双 11”交易订单时发现,有大批在11月11日23:59:59 左右支付的交易订单漂移到了12日 。主要原因是用户下单支
付后系统需要调用支付宝的接口而有所延迟,从而导致这些订单最终生成的时间跨天了。即 modified_time和log_time 都晚于proc_time
如果订单只有一个支付业务过程,则可以用支付时间来限制就能获取到正确的数据。但是往往实际订单有多个业务过程 下单、支付、成
功,每个业务过程都有相应的时间戳字段,并不只有支付数据会漂移。如果直接通过多获取后 天的数据,然后限制这些时间,则可以获
取到相关数据,但是后 天的数据可能已经更新多次,我们直接获取到的那条记录已经是更新多次后的状态,数据的准确性存在 定的问题。
因此,我们可以根据实际情况获取后15分钟的数据,并限制个业务过程的时间戳字段(下单、支付、成功)都是“双 ”当天的,然后对这些数据按照订单的 modified_time 升序排列,获取每个订单首次数据变更的那条记录。
此外,我们可以根据 log_time 分别冗余前 天最后15 分钟的数据和后 天凌晨开始 15 分钟的数据,并用 modified_time 过滤非当天数据,
针对每个订单按照 log_time 进行降序排列 ,取每个订单当天最后一次数据变更的那条记录。
最后将两份数据根据订单做全外连接,将漂移数据回补到当天数据中。

==========================分割线==========================
上面讲的比较晦涩,例子由于没有具体数据的支撑也比较难以理解。我凭着自己的理解和对实际数据的想象对上面的例子做一点解释。

首先场景是在双11当天的23:59:59时有大量支付订单由于调用链路长以及网络延迟等原因,最终数据入库的实际漂移到了12日。
在我理解这里面的数据应该是mysql库的binlog日志。

  • proc_time:数据的产生的事件时间。不同的业务过程理解不同,支付的是支付时间,下单的是下单时间。
  • modified_time:数据更新时间,不同的业务过程可能有多个状态的数据,比如支付有待支付和已支付等状态。
  • log_time:binlog日志时间。
    正常proc_time<log_time<modified_time
    由于每个业务过程可能经过很多状态的变化,所以只获取漂移后的第一个状态数据,因为有可能在后一天已经对漂移的数据做了状态变更过。
    主要分两步操作:
    1.获取当天漂移的数据。获取后一天15分钟的数据,限制业务过程时间戳proc_time=双11,并按modified_time升序排序,取第一条。
    proc_time=双11,即获取双11漂移到12日的数据,modified_time升序排序为了取第一条状态的数据。
    2.获取当天未漂移的数据并剔除前一天漂移过来的数据。根据 log_time 分别冗余前一天最后15 分钟的数据和后一天凌晨开始15 分钟的数据,并用modified_time 过滤非当天数据,针对每个订单按照 log_time 进行降序排列 ,取每个订单当天最后一次数据变更的那条记录。
    分别冗余前一天最后15分钟和后一天前15分钟数据,目的是考虑到有往前漂移的场景。
    modified_time 过滤非当天数据,即modified_time!=双11,过滤掉前后两天的正常数据。
    log_time 降序排列 ,只取每个订单当天最后一次数据变更。只取订单当天即log_time=双11,剔除前一天漂移过来的数据。
    最后对这两部分数据做全外连接即得到当天所有的数据。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355