再議數(shù)據(jù)倉(cāng)庫(kù)之拉鏈算法

拉鏈算法是目前數(shù)據(jù)倉(cāng)庫(kù)領(lǐng)域比較XX的算法之一..通用非常廣.記錄數(shù)據(jù)量很大且為全量實(shí)體記錄歷史的操作庆揪。

例如式曲,某某移動(dòng)通信公司客戶資料,以河北為例缸榛,河北有客戶2800W吝羞,客戶資料每個(gè)一條就是2800W條記錄算上歷史客戶,全量大概有5000W條左右内颗。作為數(shù)據(jù)倉(cāng)庫(kù)來(lái)存儲(chǔ)這些信息幾千萬(wàn)條記錄不算什么钧排。可是要是記錄歷史全量所用到的存儲(chǔ)就非常的龐大均澳。問(wèn)題實(shí)例為:一般正常情況下恨溜,從河北移動(dòng)的BOSS系統(tǒng)上每天采集全量的日數(shù)據(jù)大概為2500W條,歷史存儲(chǔ)每天存儲(chǔ)一個(gè)2500W條的日表找前,存儲(chǔ)三個(gè)月糟袁,就需要3302500W條的數(shù)據(jù)存儲(chǔ)空間,數(shù)據(jù)量為20E躺盛。這只是存儲(chǔ)三個(gè)月的歷史如果存儲(chǔ)更長(zhǎng)時(shí)間則無(wú)法估計(jì)需要的存儲(chǔ)项戴。而用拉鏈算法存儲(chǔ)。每日只是向歷史表(HIS)中添加新增和變化的數(shù)據(jù)量槽惫。每日不過(guò)數(shù)十W條周叮。存儲(chǔ)一年也就是需要5000W條記錄的存儲(chǔ)空間即兩個(gè)日全量的空間。下面詳細(xì)介紹下拉鏈算法:
1.采集當(dāng)日全量存儲(chǔ)到 ND(NewDay)表中躯枢。(比正常的全量表多兩個(gè)字段(START_DATE&END_DATE))
2.可從歷史表中取出昨日全量數(shù)據(jù)存儲(chǔ)到 OD(OldDay)表中则吟。(比正常的全量表多兩個(gè)字段(START_DATE&END_DATE))
3.用ND-OD為當(dāng)日新增和變化的數(shù)據(jù)(即每日增量)。
4.用OD-ND為狀態(tài)到此結(jié)束需要封鏈的數(shù)據(jù)锄蹂。
5.歷史表(HIS)比ND表和OD表多兩個(gè)字段(START_DATE&END_DATE)
6.針對(duì)第三部來(lái)講氓仲,ND和OD表的(START_DATE&END_DATE)分別記錄當(dāng)前日期和最大日期,取意為開(kāi)始日期為當(dāng)前天的數(shù)據(jù)和結(jié)束日期為最大日期。注意OD和ND的START_DATE
ND——OD兩個(gè)表進(jìn)行全字段比較但是(START_DATE&END_DATE)除外敬扛。將結(jié)果記錄到W_I表中
OD——ND兩個(gè)表進(jìn)行全字段比較同樣(START_DATE&END_DATE)除外晰洒。將結(jié)果記錄到W_U表中
7.將W_I表的內(nèi)容全部插入到HIS表中。
8. 對(duì)歷史表(HIS)和OD表比較對(duì)歷史表最更新操作即在歷史表(HIS)中數(shù)據(jù)進(jìn)行更新操作以W_U表為準(zhǔn)啥箭,即對(duì)歷史表與W_U比對(duì)(START_DATE&END_DATE除外)谍珊,在歷史表(HIS)中也在W_U表中的數(shù)據(jù)將其END_DATE改成當(dāng)前天,說(shuō)明該記錄對(duì)當(dāng)前天失效急侥。
9砌滞。取數(shù)據(jù)時(shí)候?qū)θ掌谶M(jìn)行條件選擇即可如:取20080101日的數(shù)據(jù)條件部分為
(where start-date<='20080101' and end_date>20070801 )即可
全部SQL為:
(select * from table(his) where start-date<='20080101' and end_date>20070801 )

下面為具體例子:

OD(在第一天就等于HIS)
用戶標(biāo)志 狀態(tài) 開(kāi)始時(shí)間 結(jié)束時(shí)間
1 1 200712 299901
2 2 200712 299901
3 3 200712 299901
4 4 200712 299901
5 5 200712 299901

ND
用戶標(biāo)志 狀態(tài) 開(kāi)始時(shí)間 結(jié)束時(shí)間
1 2 200801 299901
2 2 200801 299901
3 4 200801 299901
4 4 200801 299901
5 6 200801 299901

W_I=ND-OD
用戶標(biāo)志 狀態(tài) 開(kāi)始時(shí)間 結(jié)束時(shí)間
1 2 200801 299901
3 4 200801 299901
5 6 200801 299901

W_U=OD-ND
用戶標(biāo)志 狀態(tài) 開(kāi)始時(shí)間 結(jié)束時(shí)間
1 1 200712 299901
3 3 200712 299901
5 5 200712 299901

INSERT操作 把I插入到HIS
用戶標(biāo)志 狀態(tài) 開(kāi)始時(shí)間 結(jié)束時(shí)間
1 1 200712 299901
2 2 200712 299901
3 3 200712 299901
4 4 200712 299901
5 5 200712 299901
1 2 200801 299901
3 4 200801 299901
5 6 200801 299901

update操作 按U更新HIS
用戶標(biāo)志 狀態(tài) 開(kāi)始時(shí)間 結(jié)束時(shí)間
1 1 200712 200801
2 2 200712 299901
3 3 200712 200801
4 4 200712 299901
5 5 200712 200801
1 2 200801 299901
3 4 200801 299901
5 6 200801 299901

表結(jié)構(gòu)設(shè)計(jì)之拉鏈表

(一)概念
拉鏈表是針對(duì)數(shù)據(jù)倉(cāng)庫(kù)設(shè)計(jì)中表存儲(chǔ)數(shù)據(jù)的方式而定義的,顧名思義坏怪,所謂拉鏈贝润,就是記錄歷史。記錄一個(gè)事物從開(kāi)始铝宵,一直到當(dāng)前狀態(tài)的所有變化的信息打掘。

在歷史表中對(duì)客戶的一生的記錄可能就這樣幾條記錄,避免了按每一天記錄客戶狀態(tài)造成的海量存儲(chǔ)的問(wèn)題:
(NAME)人名 (START-DATE)開(kāi)始日期 (END-DT)結(jié)束日期 (STAT)狀態(tài)
client 19000101 19070901 H在家
client 19070901 19130901 A小學(xué)
client 19130901 19160901 B初中
client 19160901 19190901 C高中
client 19190901 19230901 D大學(xué)
client 19230901 19601231 E公司
client 19601231 29991231 H退休在家

上面的每一條記錄都是不算末尾的鹏秋,比如到19070901尊蚁,client已經(jīng)在A,而不是H了侣夷。所以除最后一條記錄因?yàn)闋顟B(tài)到目前都未改變的横朋,其余的記錄實(shí)際上在END-DT那天,都不在是該條記錄END-DT那天的狀態(tài)百拓。這種現(xiàn)象可以理解為算頭不算尾叶撒。

(二)算法
1采集當(dāng)日全量數(shù)據(jù)到ND(NewDay)表;
2可從歷史表中取出昨日全量數(shù)據(jù)存儲(chǔ)到OD(OldDay)表;
3(ND-OD)就是當(dāng)日新增和變化的數(shù)據(jù)耐版,也就是當(dāng)天的增量,用W_I表示压汪;
4(OD-ND)為狀態(tài)到此結(jié)束需要封鏈的數(shù)據(jù)粪牲,用W_U表示;

5將W_I表的內(nèi)容全部插入到歷史表中止剖,這些是新增記錄腺阳,start_date為當(dāng)天,而end_date為max值穿香;
6對(duì)歷史表進(jìn)行W_U部份的更新操作亭引,start_date保持不變,而end_date改為當(dāng)天皮获,也就是關(guān)鏈操作焙蚓;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子购公,更是在濱河造成了極大的恐慌萌京,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宏浩,死亡現(xiàn)場(chǎng)離奇詭異知残,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)比庄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)求妹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人佳窑,你說(shuō)我怎么就攤上這事制恍。” “怎么了华嘹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵吧趣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我耙厚,道長(zhǎng)强挫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任薛躬,我火速辦了婚禮俯渤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘型宝。我一直安慰自己八匠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布趴酣。 她就那樣靜靜地躺著梨树,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岖寞。 梳的紋絲不亂的頭發(fā)上抡四,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音仗谆,去河邊找鬼指巡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛隶垮,可吹牛的內(nèi)容都是我干的藻雪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼狸吞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勉耀!你這毒婦竟也來(lái)了指煎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瑰排,失蹤者是張志新(化名)和其女友劉穎贯要,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體椭住,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崇渗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了京郑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宅广。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖些举,靈堂內(nèi)的尸體忽然破棺而出跟狱,到底是詐尸還是另有隱情,我是刑警寧澤户魏,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布驶臊,位于F島的核電站,受9級(jí)特大地震影響叼丑,放射性物質(zhì)發(fā)生泄漏关翎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一鸠信、第九天 我趴在偏房一處隱蔽的房頂上張望纵寝。 院中可真熱鬧,春花似錦星立、人聲如沸爽茴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)室奏。三九已至,卻和暖如春劲装,著一層夾襖步出監(jiān)牢的瞬間窍奋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工酱畅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人江场。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓纺酸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親址否。 傳聞我的和親對(duì)象是個(gè)殘疾皇子餐蔬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容