基于MaxCompute的拉链表设计

摘要: 简单的拉链表设计

背景信息:

在数据仓库的数据模型设计过程中,经常会遇到这样的需求: 

数据量比较大; 

表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态、手机号码等等; 

需要查看某一个时间点或者时间段的历史快照信息。(比如,查看某一个订单在历史某一个时间点的状态,比如,查看某一个用户在过去某一段时间内,更新过几次等等) 

变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右;如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费; 


综上所述:引入’拉链历史表’,既能满足反应数据的历史状态,又可以最大程度的节省存储。 

(备注:在阿里巴巴内部很大程度上是基于存储换计算来提供开发的效率及易用性,因为在当今,存储的成本远低于CPU和内存。因此在阿里巴巴内部会采用快照的方式将每日的全量数据进行快照,同时也会通过极限存储的方式,压缩率高,在合适的场景下,约能压缩为原始数据的1/30。)

Demo数据

以下只是demo如何在MaxCompute中实现拉链表,所以是基于一些假设: 

同一天中同一订单只有一个状态发生; 

基于20150821及之前的数据并没有同一个订单有两个状态的最简单场景模拟; 

且数据源在阿里云RDS for Mysql中。且表明为orders。

20150821以及之前的历史订单数据:

20150822订单数据:

20150823的订单数据:

实现思路

全量初始化:将2015-08-21及以前的全量历史数据通过全量方式同步至ODS并刷进DW层。 

增量更新:将2015-08-22、2015-08-23的全天增量数据以增量方式刷入下游数据。

全量初始化

创建节点任务:数据同步 

选择调度类型:手动调度 

配置数据同步任务:Mysql:Orders–>ODPS:ods_orders_inc_d 

where条件配置:modifiedtime <= ‘20150821’ 

分区值dt=20150821

提交调度系统,待数据同步任务执行成功后,再将ODS数据刷入DW。 

创建SQL脚本:

INSERToverwriteTABLEdw_orders_his_dSELECTorderid,createtime,modifiedtime,o_status,createtimeASdw_start_date,'99991231'ASdw_end_dateFROMods_orders_inc_dWHEREdt ='20150821';

数据如下:

通过以上步骤可以将2015-08-21及以前的历史全量数据一次性刷入DW和ODS中。

增量抽取并生成拉链表

创建工作流任务并选择周期性调度。 

依次拖入数据同步节点任务和SQL任务。 

在数据同步任务中where条件配置为:modifiedtime=bdp.system.bizdate目标表odsordersincd分区配置为dt={bdp.system.bizdate} 

配置SQL节点,且为数据同步节点的下游节点。

--通过DW历史数据和ODS增量数据刷新DW表insertoverwritetabledw_orders_his_dSELECTa0.orderid, a0.createtime, a0.modifiedtime, a0.o_status, a0.dw_start_date, a0.dw_end_dateFROM(    -- 对orderid进行开窗然后按照生命周期结束时间倒序排,支持重跑SELECTa1.orderid, a1.createtime, a1.modifiedtime, a1.o_status, a1.dw_start_date, a1.dw_end_date    , ROW_NUMBER() OVER (distributeBYa1.orderid,a1.createtime, a1.modifiedtime,a1.o_status sortBYa1.dw_end_dateDESC)ASnumsFROM(        -- 用历史数据与增量22日的数据进行匹配,当发现在22日新增数据中存在且end_date > 当前日期的就表示数据状态发生过变化,然后修改生命周期        

-- 修改昨日已经生命截止的数据并union最新增量数据到DW

SELECTa.orderid, a.createtime, a.modifiedtime, a.o_status, a.dw_start_date              ,CASEWHENb.orderidISNOTNULLANDa.dw_end_date > ${bdp.system.bizdate}THEN${yesterday}ELSEa.dw_end_dateENDASdw_end_dateFROMdw_orders_his_d aLEFTOUTERJOIN(SELECT*FROMods_orders_inc_dWHEREdt = ${bdp.system.bizdate}        ) bONa.orderid = b.orderidUNIONALL--2015-08-22的增量数据刷新到DWSELECTorderid, createtime, modifiedtime, o_status, modifiedtimeASdw_start_date            ,'99991231'ASdw_end_dateFROMods_orders_inc_dWHEREdt = ${bdp.system.bizdate}    ) a1) a0 -- 开窗口后对某个订单中生命周期为'9999-12-31'的取值并写入,防止重跑数据情况。WHEREa0.nums =1orderbya0.orderid,a0.dw_start_date;

备注:测试运行的时候,选择业务日期为20150822。也可以通过补数据方式,直接把20150822和20150823两天的增量数据刷入DW中。上面SQL中yesterday为自定义变量,其赋值为{yyyymmdd-1}

通过如上方式将20150822的增量数据刷入DW,如下所示:

通过同样的方式将2015-08-23日的数据增量输入DW,其结果为: 

关于基于历史拉链表回滚某一天或一段时间内的数据,还是一个相对比较复杂的话题,这个可以下载再谈。

原文链接

阅读更多干货好文,请关注扫描以下二维码: 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容