日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于MaxCompute的拉链表设计

發(fā)布時(shí)間:2024/8/23 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于MaxCompute的拉链表设计 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘要: 簡(jiǎn)單的拉鏈表設(shè)計(jì)

背景信息:

在數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)模型設(shè)計(jì)過(guò)程中,經(jīng)常會(huì)遇到這樣的需求:
數(shù)據(jù)量比較大;
表中的部分字段會(huì)被update,如用戶的地址,產(chǎn)品的描述信息,訂單的狀態(tài)、手機(jī)號(hào)碼等等;
需要查看某一個(gè)時(shí)間點(diǎn)或者時(shí)間段的歷史快照信息。(比如,查看某一個(gè)訂單在歷史某一個(gè)時(shí)間點(diǎn)的狀態(tài),比如,查看某一個(gè)用戶在過(guò)去某一段時(shí)間內(nèi),更新過(guò)幾次等等)
變化的比例和頻率不是很大,比如,總共有1000萬(wàn)的會(huì)員,每天新增和發(fā)生變化的有10萬(wàn)左右;如果對(duì)這邊表每天都保留一份全量,那么每次全量中會(huì)保存很多不變的信息,對(duì)存儲(chǔ)是極大的浪費(fèi);
 

綜上所述:引入’拉鏈歷史表’,既能滿足反應(yīng)數(shù)據(jù)的歷史狀態(tài),又可以最大程度的節(jié)省存儲(chǔ)。
(備注:在阿里巴巴內(nèi)部很大程度上是基于存儲(chǔ)換計(jì)算來(lái)提供開發(fā)的效率及易用性,因?yàn)樵诋?dāng)今,存儲(chǔ)的成本遠(yuǎn)低于CPU和內(nèi)存。因此在阿里巴巴內(nèi)部會(huì)采用快照的方式將每日的全量數(shù)據(jù)進(jìn)行快照,同時(shí)也會(huì)通過(guò)極限存儲(chǔ)的方式,壓縮率高,在合適的場(chǎng)景下,約能壓縮為原始數(shù)據(jù)的1/30。)

Demo數(shù)據(jù)

以下只是demo如何在MaxCompute中實(shí)現(xiàn)拉鏈表,所以是基于一些假設(shè):
同一天中同一訂單只有一個(gè)狀態(tài)發(fā)生;
基于20150821及之前的數(shù)據(jù)并沒有同一個(gè)訂單有兩個(gè)狀態(tài)的最簡(jiǎn)單場(chǎng)景模擬;
且數(shù)據(jù)源在阿里云RDS for Mysql中。且表明為orders。

20150821以及之前的歷史訂單數(shù)據(jù):

20150822訂單數(shù)據(jù):

20150823的訂單數(shù)據(jù):

創(chuàng)建MaxCompute表

–ODS層:訂單的增量數(shù)據(jù)表,按天分區(qū),存放每天的增量數(shù)據(jù)

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

–DW層:歷史數(shù)據(jù)拉鏈表,存放訂單的歷史狀態(tài)數(shù)據(jù)

CREATE TABLE dw_orders_his_d (orderid BIGINT COMMENT '訂單ID',createtime STRING COMMENT '訂單創(chuàng)建時(shí)間',modifiedtime STRING COMMENT '訂單修改時(shí)間',o_status STRING COMMENT '訂單修改時(shí)間',dw_start_date STRING COMMENT '訂單生命周期開始時(shí)間',dw_end_date STRING COMMENT '訂單生命周期結(jié)束時(shí)間' );

實(shí)現(xiàn)思路

全量初始化:將2015-08-21及以前的全量歷史數(shù)據(jù)通過(guò)全量方式同步至ODS并刷進(jìn)DW層。
增量更新:將2015-08-22、2015-08-23的全天增量數(shù)據(jù)以增量方式刷入下游數(shù)據(jù)。

全量初始化

創(chuàng)建節(jié)點(diǎn)任務(wù):數(shù)據(jù)同步
選擇調(diào)度類型:手動(dòng)調(diào)度
配置數(shù)據(jù)同步任務(wù):Mysql:Orders–>ODPS:ods_orders_inc_d
where條件配置:modifiedtime <= ‘20150821’
分區(qū)值dt=20150821

提交調(diào)度系統(tǒng),待數(shù)據(jù)同步任務(wù)執(zhí)行成功后,再將ODS數(shù)據(jù)刷入DW。
創(chuàng)建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';

數(shù)據(jù)如下:

通過(guò)以上步驟可以將2015-08-21及以前的歷史全量數(shù)據(jù)一次性刷入DW和ODS中。

增量抽取并生成拉鏈表

創(chuàng)建工作流任務(wù)并選擇周期性調(diào)度。
依次拖入數(shù)據(jù)同步節(jié)點(diǎn)任務(wù)和SQL任務(wù)。
在數(shù)據(jù)同步任務(wù)中where條件配置為:modifiedtime=bdp.system.bizdate標(biāo)odsordersincd區(qū)dt={bdp.system.bizdate}
配置SQL節(jié)點(diǎn),且為數(shù)據(jù)同步節(jié)點(diǎn)的下游節(jié)點(diǎn)。

--通過(guò)DW歷史數(shù)據(jù)和ODS增量數(shù)據(jù)刷新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 (-- 對(duì)orderid進(jìn)行開窗然后按照生命周期結(jié)束時(shí)間倒序排,支持重跑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 (-- 用歷史數(shù)據(jù)與增量22日的數(shù)據(jù)進(jìn)行匹配,當(dāng)發(fā)現(xiàn)在22日新增數(shù)據(jù)中存在且end_date > 當(dāng)前日期的就表示數(shù)據(jù)狀態(tài)發(fā)生過(guò)變化,然后修改生命周期-- 修改昨日已經(jīng)生命截止的數(shù)據(jù)并union最新增量數(shù)據(jù)到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的增量數(shù)據(jù)刷新到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 -- 開窗口后對(duì)某個(gè)訂單中生命周期為'9999-12-31'的取值并寫入,防止重跑數(shù)據(jù)情況。 WHERE a0.nums = 1 order by a0.orderid,a0.dw_start_date;

備注:測(cè)試運(yùn)行的時(shí)候,選擇業(yè)務(wù)日期為20150822。也可以通過(guò)補(bǔ)數(shù)據(jù)方式,直接把20150822和20150823兩天的增量數(shù)據(jù)刷入DW中。上面SQL中yesterday{yyyymmdd-1}

通過(guò)如上方式將20150822的增量數(shù)據(jù)刷入DW,如下所示:

通過(guò)同樣的方式將2015-08-23日的數(shù)據(jù)增量輸入DW,其結(jié)果為:

如何使用拉鏈表

查看某一天的全量歷史快照數(shù)據(jù)。

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

取一段時(shí)間的變化記錄集合,如在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;

取最新的數(shù)據(jù)。

SELECT * FROM dw_orders_his_d WHERE dw_end_date = '99991231'

關(guān)于基于歷史拉鏈表回滾某一天或一段時(shí)間內(nèi)的數(shù)據(jù),還是一個(gè)相對(duì)比較復(fù)雜的話題,這個(gè)可以下載再談。

原文鏈接

干貨好文,請(qǐng)關(guān)注掃描以下二維碼:

總結(jié)

以上是生活随笔為你收集整理的基于MaxCompute的拉链表设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。