基于MaxCompute的拉链表设计

摘要: 简单的拉链表设计

背景信息:

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

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

Demo数据

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

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

图片描述

20150822订单数据:

图片描述

20150823的订单数据:

图片描述

创建MaxCompute表

–ODS层:订单的增量数据表,按天分区,存放每天的增量数据

CREATE TABLE ods_orders_inc_d
(orderid BIGINT,createtime STRING,modifiedtime STRING,o_status STRING
)
PARTITIONED BY (dt STRING)
LIFECYCLE 7;

–DW层:历史数据拉链表,存放订单的历史状态数据

CREATE TABLE dw_orders_his_d
(orderid BIGINT COMMENT '订单ID',createtime STRING COMMENT '订单创建时间',modifiedtime STRING COMMENT '订单修改时间',o_status STRING COMMENT '订单修改时间',dw_start_date STRING COMMENT '订单生命周期开始时间',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中。

增量抽取并生成拉链表

创建工作流任务并选择周期性调度。
依次拖入数据同步节点任务和SQL任务。
在数据同步任务中where条件配置为:modifiedtime=bdp.system.bizdateodsordersincddt={bdp.system.bizdate}
配置SQL节点,且为数据同步节点的下游节点。

--通过DW历史数据和ODS增量数据刷新DW表
insert overwrite table dw_orders_his_d 
SELECT a0.orderid, a0.createtime, a0.modifiedtime, a0.o_status, a0.dw_start_date, a0.dw_end_date
FROM (-- 对orderid进行开窗然后按照生命周期结束时间倒序排,支持重跑SELECT a1.orderid, a1.createtime, a1.modifiedtime, a1.o_status, a1.dw_start_date, a1.dw_end_date, ROW_NUMBER() OVER (distribute BY a1.orderid,a1.createtime, a1.modifiedtime,a1.o_status sort BY a1.dw_end_date DESC) AS numsFROM (-- 用历史数据与增量22日的数据进行匹配,当发现在22日新增数据中存在且end_date > 当前日期的就表示数据状态发生过变化,然后修改生命周期-- 修改昨日已经生命截止的数据并union最新增量数据到DWSELECT a.orderid, a.createtime, a.modifiedtime, a.o_status, a.dw_start_date  , CASE WHEN b.orderid IS NOT NULL AND a.dw_end_date > ${bdp.system.bizdate} THEN ${yesterday}ELSE a.dw_end_dateEND AS dw_end_dateFROM dw_orders_his_d aLEFT OUTER JOIN (SELECT *FROM ods_orders_inc_dWHERE dt = ${bdp.system.bizdate}) bON a.orderid = b.orderidUNION ALL--2015-08-22的增量数据刷新到DWSELECT orderid, createtime, modifiedtime, o_status, modifiedtime AS dw_start_date, '99991231' AS dw_end_dateFROM ods_orders_inc_dWHERE dt = ${bdp.system.bizdate}) a1
) a0 
-- 开窗口后对某个订单中生命周期为'9999-12-31'的取值并写入,防止重跑数据情况。
WHERE a0.nums = 1
order by a0.orderid,a0.dw_start_date;

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

图片描述

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

图片描述

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

如何使用拉链表

查看某一天的全量历史快照数据。

SELECT *
FROM dw_orders_his_d
WHERE dw_start_date <= '20150822'AND dw_end_date >= '20150822'
ORDER BY orderid
LIMIT 10000;

取一段时间的变化记录集合,如在20150822-20150823变化的记录。

SELECT *
FROM dw_orders_his_d
WHERE dw_start_date <= '20150823'AND dw_end_date >= '20150822'
ORDER BY orderid
LIMIT 10000;

查看某一订单历史变化情况。

SELECT *
FROM dw_orders_his_d
WHERE orderid = 8
ORDER BY dw_start_date;

取最新的数据。

SELECT *
FROM dw_orders_his_d
WHERE dw_end_date = '99991231'

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

原文链接

干货好文,请关注扫描以下二维码:
图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019全球编程语言高薪排行榜登场;余承东正式宣布华为IFA2019 或发布麒麟990;OPPO、vivo和小米成立互传联盟…...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 全新的索尼PS5&#xff08;图…

python文件输出log_Python同时向控制台和文件输出日志logging的方法

#-*- coding:utf-8 -*- import logging # 配置日志信息 logging.basicConfig(levellogging.DEBUG, format%(asctime)s %(name)-12s %(levelname)-8s %(message)s, datefmt%m-%d %H:%M, filenamemyapp.log, filemodew) # 定义一个Handler打印INFO及以上级别的日志到sys.stderr c…

MaxCompute使用常见问题总结

摘要&#xff1a; Maxcompute常见问题的总结&#xff0c;方便广大用户可以快速排查问题 计费相关 存储计费&#xff1a;按照存储在 MaxCompute 的数据的容量大小进行阶梯计费。 计算计费&#xff1a;MaxCompute 分按量后付费和按 CU 预付费两种计算计费方式。 按量后付费&#…

工作流实战_02_flowable 流程模板导入

由于群里有些朋友对这个flowable还不是很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;633168411 里面都是…

华为服务器raid1装系统,服务器raid1系统安装

服务器raid1系统安装 内容精选换一换需要创建两台ECS&#xff0c;一台使用Linux系统安装SAP应用与DB2&#xff0c;另外一台用于安装SAP GUI和作为跳板机&#xff0c;两台ECS详情如下所示&#xff0c;下表均为示例&#xff0c;请根据实际情况购买Avago 3408iMR RAID卡不支持虚拟…

关于大数据你应该了解的五件事儿

摘要&#xff1a; 本文从基本概念、行业趋势、学习途径等几个方面介绍了大数据的相关内容&#xff0c;适合对大数据感兴趣的读者作为入门材料阅读。随着科技的发展&#xff0c;目前已经步入了大数据的时代&#xff0c;很多社交媒体和互联网公司也非常关注大数据这一行业。那么对…

当我们谈AI时,到底该谈什么?

报名倒计时仅剩1天&#xff0c;即刻扫描下方二维码&#xff0c;或者点击【阅读原文】免费报名&#xff0c;让我们不见不散。

前端电子表数字字体_爬虫:如何优雅应对字体反爬

目录THE BEGIN一 什么是字体反爬二 如何解密1.人工解密2.工具解密三 建立映射关系四 解密THE BEGIN网页数据爬取可以简单分为三步&#xff1a;抓取页面&#xff0c;分析页面&#xff0c;存储数据。其中第一二步最为头疼&#xff0c;因为每个站点各有特色&#xff0c;你要不断检…

ECS云资源可视化--资源概览

摘要&#xff1a; 随着越来越多的业务接入云计算&#xff0c;云上拥有的各类资源也越来越多&#xff0c;用户如何时时对其拥有的各类资源进行统计分析成为一个难题。ECS控制台针对这一问题&#xff0c;推出资源概览功能&#xff0c;目前支持实例和存储两种云资源的统计和分析功…

工作流实战_03_flowable 流程模板部署

由于群里有些朋友对这个flowable还不是 很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;633168411 里面都是…

为物联网而生:高性能时间序列数据库HiTSDB商业化首发!

摘要&#xff1a; 近日&#xff0c;阿里云宣布高性能时间序列数据库 (High-Performance Time Series Database , 简称 HiTSDB) 正式商业化。 近日&#xff0c;阿里云宣布高性能时间序列数据库 (High-Performance Time Series Database , 简称 HiTSDB) 正式商业化。 先跟大家聊一…

kafka系统设计开篇

戳蓝字“CSDN云计算”关注我们哦&#xff01;来源 | 靳刚同学MQ&#xff08;消息队列&#xff09;是跨进程通信的方式之一&#xff0c;可理解为异步rpc&#xff0c;上游系统对调用结果的态度往往是重要不紧急。使用消息队列有以下好处&#xff1a;业务解耦、流量削峰、灵活扩展…

工作流实战_04_flowable 流程的模板的图片和xml显示

由于群里有些朋友对这个flowable还不是 很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;633168411 里面都是…

成功使用机器学习技术的3个技巧

摘要&#xff1a; 本文讲述了3个针对机器学习的小技巧&#xff0c;相信对正在学习机器学习的朋友有所帮助机器学习、自然语言处理(NLP)和认知搜索技术正以高速率被采用&#xff0c;这并不稀奇。随着组织努力创造价值&#xff0c;增强客户体验&#xff0c;遵守严格的规定并使自己…

Spring精华问答 | 如何集成Spring Boot?

Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持。今天就让我们一起来看看关于Spring的精华问答吧。1Q&#xff1a;如何在自定义端口上运行Spring Boot应用程序&#xff1f;A&#xff1a;为了在自定义端口上运行Spring…

Andrew Ng深度学习课程笔记

摘要&#xff1a; 本文对Andrew Ng深度学习课程进行了大体的介绍与总结&#xff0c;共包括21个课程。我最近在Coursera上完成了Andrew Ng导师关于新深度学习的所有课程。Ng在解释术语和概念方面做得非常出色。例如&#xff0c;Ng指出&#xff0c;监督深度学习只不过是一种多维曲…

工作流实战_05_flowable 流程定义的挂起与激活

由于群里有些朋友对这个flowable还不是 很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;633168411 里面都是…

技嘉注入usb 3.0工具_技嘉怎么安装win10系统 技嘉安装win10系统步骤【图文介绍】...

技嘉笔记本性能配置高端&#xff0c;质量一流&#xff0c;技嘉科技在主板方面也及其出色&#xff0c;因此自身生产的电脑配置也相当专业。若要用技嘉 安装win10系统 要怎么做比较快呢?最简单的方法便是用u盘装系统了&#xff0c;u盘装系统可谓是傻瓜式一键装机&#xff0c;让装…

为什么深度学习没有取代传统的计算机视觉?

摘要&#xff1a; 深度学习大潮为什么淹没传统的计算机视觉技术&#xff1f;听听大牛怎么说~这篇文章是受到论坛中经常出现的问题所创作的&#xff1a;深度学习是否可以取代传统的计算机视觉&#xff1f;这明显是一个很好的问题&#xff0c;深度学习&#xff08;DL&#xff09;…

赋能网安生态通信服务器操作系统,紫光展锐打造操作系统生态,赋能万物互联智能时代...

本周&#xff0c;以“象由芯生科技服务人民”为主题的2020紫光展锐市场峰会重磅开启&#xff0c;广大生态合作伙伴共聚一堂&#xff0c;共话数字世界新未来。在今天举办的“操作系统OS研讨会”上&#xff0c;来自紫光展锐工程一线的架构师带来了一场整个操作系统领域的饕餮盛宴…