基于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腳本:
數據如下:
通過以上步驟可以將2015-08-21及以前的歷史全量數據一次性刷入DW和ODS中。
增量抽取并生成拉鏈表
創建工作流任務并選擇周期性調度。
依次拖入數據同步節點任務和SQL任務。
在數據同步任務中where條件配置為:modifiedtime=bdp.system.bizdate目標表odsordersincd分區配置為dt={bdp.system.bizdate}
配置SQL節點,且為數據同步節點的下游節點。
備注:測試運行的時候,選擇業務日期為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'關于基于歷史拉鏈表回滾某一天或一段時間內的數據,還是一個相對比較復雜的話題,這個可以下載再談。
原文鏈接
干貨好文,請關注掃描以下二維碼:
總結
以上是生活随笔為你收集整理的基于MaxCompute的拉链表设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超干货|使用Keras和CNN构建分类器
- 下一篇: 教你编写一个机器学习代码也能使用的单元测