數據倉庫之拉鍊算法

鏈:古代軟兵器的中介之物,故名思意.有着連接、銜接的意思.拉鍊算法是目前數據 倉庫領域比較XX的算法之一..通用非常廣.記錄數 據量很大且爲全量實體記錄歷史的操作。例如,某某移動通信公司客戶資料 ,以河北爲例,河北有客戶2800W,客戶資料每個 一條就是2800W條記錄算上歷史客戶,全量大概有5000W條左右。作爲數據倉庫 來存儲這些信息幾千萬條記錄不算什麼。可是要 是記錄歷史全量所用到的存儲就非常的龐大。問題實例爲:一般正常情況下,從河北移動的BOSS系統 上每天採集全量的日數據大概爲2500W條,歷史存 儲每天存儲一個2500W條的日表,存儲三個月,就需要3*30*2500W條的數據存儲空間,數據量爲20E。這只是存儲三個月的歷史如果存儲更長時間 則無法估計需要的存儲。而用拉鍊算法存儲。每日只是 向歷史表(HIS)中添加新增和變化的數據量。每日不過數十W條。存儲一年也就是需要5000W條記錄的存儲空間即兩個日全量的空間。下面詳細介紹下拉鍊 算法:
1.採集當日全量存儲到 ND(NewDay) 表中。(比正常的全量表多兩個字段(START_DATE&END_DATE))
2.可從歷史表中取出昨日全量數據存儲到 OD(OldDay)表中。(比正常的全量表多兩個字段(START_DATE&END_DATE))
3.用ND-OD爲當日新增和變化的數據(即每日增量)。
4.用OD-ND爲狀態到此結束需要封鏈的數據。
5.歷史表(HIS)比ND表和OD表多兩個字段(START_DATE&END_DATE)
6.針對第三部來講,ND和OD表的(START_DATE&END_DATE)分別記錄當前日期和最大日期,取意爲開始日期爲當前天的數據和結 束日期爲最大日期。注意OD和ND的START_DATE
ND——OD兩個表進行全字段比較但是(START_DATE&END_DATE)除外。將結果記錄到W_I表中
OD——ND兩個表進行全字段比較同樣(START_DATE&END_DATE)除外。將結果記錄到W_U表中
7.將W_I表的內容全部插入到HIS表中。
8.對歷史表(HIS)和OD表比較對歷史表最更新操作即在歷史表(HIS)中數據進行更新操作以W_U表爲準,即對歷史表與W_U比對 (START_DATE&END_DATE除外),在歷史表(HIS)中也在W_U表中的數據將其END_DATE改成當前天,說明該記錄對當前 天失效。
9。取數據時候對日期進行條件選擇即可如:取20080101日的數據條件部分爲
(where start-date<='20080101' and end_date>20070801 )即可
全部SQL 爲:
(select * from table(his) where start-date<='20080101' and end_date>20070801 )
-
下面爲具體例子:
-
OD(在第一天就等於HIS)
用戶 標誌 狀態 開始時間 結束時間
1 1 200712 299901
2 2 200712 299901
3 3 200712 299901
4 4 200712 299901
5 5 200712 299901
-
ND
用戶標誌 狀態 開始時間 結束時間
1 2 200801 299901
2 2 200801 299901
3 4 200801 299901
4 4 200801 299901
5 6 200801 299901
W_I=ND-OD
用戶標誌 狀態 開始時間 結束時間
1 2 200801 299901
3 4 200801 299901
5 6 200801 299901
W_U=OD-ND
用戶標誌 狀態 開始時間 結束時間
1 1 200712 299901
3 3 200712 299901
5 5 200712 299901
INSERT操作 把I插入到HIS
用戶標誌 狀態 開始時間 結束時間
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
用戶標誌 狀態 開始時間 結束時間
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
-

 

1 取“歷史數據”全量數據,按照業務主鍵分組,關聯本表對當前(end_date=99991231)新記錄進行封尾,封尾日期爲當前數據業務日期;
2 取“歷史數據”全量數據,按照業務主鍵分組,關聯本表對當前(end_date=99991231)新記錄進行拉鍊比對更新,如果不存在 end_date=99991231的客戶記錄,則直接插入。oracle merge操作比較方便

 

拉鍊表 實際上是一個數據的有效 更新處理方法。 在定義了對於該方法支持的幾個字段後可以對數據進行處理。
講解一個加了幾個字段的的一種處理方法

模擬場景 ;

1.定義兩個臨時表,
  一個爲當日全量數據,另一個爲需要新增或更新的數據;
CREATE TABLE  A_day_full  ;
CREATE   TABLE  B    ;


2獲取當日全量數據
INSERT INTO   A   SELECT (a,b,c,cur_date, max_date) FROM SOURCE_Table


3抽取新增或有變化的數據,從 A 臨時表到B 臨時表;

INSERT INTO   B
SELECT fieldname  FROM  A
WHERE   NOT IN (select fieldname  from A_HIS where end_date='max_date');



4更新歷史表的失效記錄的end_date爲max值

UPDATE A1  FROM a_his  A1,  B  A2
SET    End_Date='current_date'
WHERE A1.xx=A2.xx  AND A1.End_Date='max_date';



5將新增或者有變化的數據插入目標表*/

INSERT INTO A_HIS SELECT  * FROM  B ;

 

完畢!

 

 

原文地址:http://www.cognoschina.net/club/thread-202-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章