你好,游客 登录
背景:
阅读新闻

基于MaxCompute的拉链表设计

[日期:2018-03-22] 来源:  作者: [字体: ]

摘要: 简单的拉链表设计

背景信息:

在数据仓库的数据模型设计过程中,经常会遇到这样的需求:
数据量比较大;
表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态、手机号码等等;
需要查看某一个时间点或者时间段的历史快照信息。(比如,查看某一个订单在历史某一个时间点的状态,比如,查看某一个用户在过去某一段时间内,更新过几次等等)
变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右;如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费;
 
图片描述

综上所述:引入’拉链历史表’,既能满足反应数据的历史状态,又可以最大程度的节省存储。
(备注:在阿里巴巴内部很大程度上是基于存储换计算来提供开发的效率及易用性,因为在当今,存储的成本远低于CPU和内存。因此在阿里巴巴内部会采用快照的方式将每日的全量数据进行快照,同时也会通过极限存储的方式,压缩率高,在合适的场景下,约能压缩为原始数据的1/30。)

Demo数据

以下只是demo如何在MaxCompute中实现拉链表,所以是基于一些假设:
同一天中同一订单只有一个状态发生;
基于20150821及之前的数据并没有同一个订单有两个状态的最简单场景模拟;
且数据源在阿里云RDS for Mysql中。且表明为orders。

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

图片描述

20150822订单数据:

图片描述

20150823的订单数据:

图片描述

 ,dw_end_date STRING COMMENT '订单生命周期结束时间'
);

实现思路

全量初始化:将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脚本:

INSERT overwrite TABLE dw_orders_his_d
SELECT orderid,createtime,modifiedtime,o_status,createtime AS dw_start_date,'99991231' AS dw_end_date
FROM ods_orders_inc_d
WHERE dt = '20150821';

数据如下:

图片描述

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

 

图片描述

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

图片描述

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

 

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

推荐 打印 | 录入:Cstor | 阅读:
相关新闻      
本文评论   
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款