大數據倉庫之拉鍊表講解與舉例說明【基礎部分】

開門見山,直接切入正題(跟着思路走~~~):

一、.什麼是拉鍊表?

維護歷史狀態,以及最新狀態數據的一種表,拉鍊表根據拉鍊粒度的不同,實際上相當於快照,只不過做了優化,去除了一部分不變的記錄,通過拉鍊表可以很方便的還原出拉鍊時點的操作記錄。(可能不是很理解,往下走~~)

二、爲什麼要使用拉鍊表?

在數據倉庫中,由於源系統每日會有數據變動,比如新增、修改、刪除,如果對每一條記錄數據倉庫都進行存儲,會出現大量重複冗餘數據,這樣會增加不必要的存儲空間,而且會使系統處理效率變低。那麼,我們如果採用拉鍊表形式存儲,對數據進行加工,對數據進行開鏈(start_date)和閉鏈(end_date),然後根據主鍵確定一條記錄,這樣既節約存儲空間,又可以隨時根據start_date和end_date的範圍查詢任何時間段的數據記錄,如果數據量太大,通過這種查詢方法很快就能找到我們需要查詢的數據,進而得到我們想要的數據結果。(比如你想知道自己某天的賬戶餘額是多少,想不起來吧,哈哈~~,接着往下走~~)

三、人狠話不多,實例接着說:

假如數據庫中有一個user表(數據倉庫表,源表),在此表中插入下列測試數據,表中信息如下(仔細看啊~~):

---12月12號,新增3條數據
 insert into table ods_dev.test_wms_test partition (data_date='20191212') values(1,'test001',1201,'張三','15900000001','同事','2019-12-12 00:00:00','2019-12-12 00:00:00','張三','TEST-01','測試1','備註1','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191212') values(2,'test002',1202,'李四','15900000002','朋友','2019-12-12 00:00:00','2019-12-12 00:00:00','李四','TEST-02','測試2','備註2','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191212') values(3,'test003',1203,'王五','15900000003','同學','2019-12-12 00:00:00','2019-12-12 00:00:00','王五','TEST-03','測試3','備註3','f');

 ---12月13號,修改id爲1的備註信息,並且新增2條數據
 insert into table ods_dev.test_wms_test partition (data_date='20191213') values(1,'test001',1201,'張三','15900000001','同事','2019-12-12 00:00:00','2019-12-12 00:00:00','張三','TEST-01','測試1','備註a','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191213') values(2,'test002',1202,'李四','15900000002','朋友','2019-12-12 00:00:00','2019-12-12 00:00:00','李四','TEST-02','測試2','備註2','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191213') values(3,'test003',1203,'王五','15900000003','同學','2019-12-12 00:00:00','2019-12-12 00:00:00','王五','TEST-03','測試3','備註3','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191213') values(4,'test004',1204,'始皇','15900000004','好友','2019-12-13 00:00:00','2019-12-13 00:00:00','始皇','TEST-04','測試4','備註4','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191213') values(5,'test005',1205,'劉邦','15900000005','家人','2019-12-13 00:00:00','2019-12-13 00:00:00','劉邦','TEST-05','測試5','備註5','f');

 ---12月14號,修改id爲3的名字(王五-->康熙),id爲5的手機號(15900000005-->15999999999),並且新增1條數據
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(1,'test001',1201,'張三','15900000001','同事','2019-12-12 00:00:00','2019-12-12 00:00:00','張三','TEST-01','測試1','備註a','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(2,'test002',1202,'李四','15900000002','朋友','2019-12-12 00:00:00','2019-12-12 00:00:00','李四','TEST-02','測試2','備註2','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(3,'test003',1203,'康熙','15900000003','同學','2019-12-12 00:00:00','2019-12-12 00:00:00','王五','TEST-03','測試3','備註3','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(4,'test004',1204,'始皇','15900000004','好友','2019-12-13 00:00:00','2019-12-13 00:00:00','始皇','TEST-04','測試4','備註4','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(5,'test005',1205,'劉邦','15999999999','家人','2019-12-13 00:00:00','2019-12-13 00:00:00','劉邦','TEST-05','測試5','備註5','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191214') values(6,'test006',1206,'朱棣','15900000006','兄弟','2019-12-14 00:00:00','2019-12-14 00:00:00','朱棣','TEST-06','測試6','備註6','f');

 ---12月15號,刪除id爲6的數據,並且新增1條數據
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(1,'test001',1201,'張三','15900000001','同事','2019-12-12 00:00:00','2019-12-12 00:00:00','張三','TEST-01','測試1','備註a','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(2,'test002',1202,'李四','15900000002','朋友','2019-12-12 00:00:00','2019-12-12 00:00:00','李四','TEST-02','測試2','備註2','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(3,'test003',1203,'康熙','15900000003','同學','2019-12-12 00:00:00','2019-12-12 00:00:00','王五','TEST-03','測試3','備註3','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(4,'test004',1204,'始皇','15900000004','好友','2019-12-13 00:00:00','2019-12-13 00:00:00','始皇','TEST-04','測試4','備註4','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(5,'test005',1205,'劉邦','15999999999','家人','2019-12-13 00:00:00','2019-12-13 00:00:00','劉邦','TEST-05','測試5','備註5','f');
 insert into table ods_dev.test_wms_test partition (data_date='20191215') values(7,'test007',1207,'劉徹','15900000007','皇室','2019-12-15 00:00:00','2019-12-15 00:00:00','劉徹','TEST-07','測試7','備註7','f');

PS:
1.可以將test表理解爲數據倉庫,數據倉庫中只保留了一份全量數據,如果我要看13號id=1的數據狀態,則無法查看;
2.每天都保留一份全量,則數據倉庫中的該表共有20條記錄,但好多記錄都是重複保存,沒有任務變化,如id=2,id=4的數據,數據量大了,會造成很大的存儲浪費;
3.如果在數據倉庫中設計成歷史拉鍊表保存該表,則拉鍊表中只有10條記錄(id=1的有2條,id=2的有1條,id=3的有2條,id=4的有1條,id=5的有2條,id=6的有1條,id=7的有1條);
4.拉鍊表中end_date=99991231說明該數據處於有效狀態(未閉鏈);
5.如果查詢當前所有有效的記錄,則:select * from ods_dev.test_zipper_test where end_date='99991231';
6.如果查詢某一天的數據狀態(歷史快照),如查詢12號數據的歷史快照:select * from ods_dev.test_zipper_test where 
   start_date<='20191212' and end_date>'20191212';
   查詢結果和12號數據倉庫表(test表)數據完全一致;
7.可以看出,這樣的歷史拉鍊表,既能滿足對歷史數據的需求,又能很大程度上節省存儲資源;

四、注意事項:

測試拉鍊表時需要注意的問題:
1.比如15號有一條數據,16號有一條數據,18號有一條數據,缺少17號的數據;
現補充17號數據(與16號的數據一致),拉鍊表中數據不變;

關於拉鍊表的基礎講解已經講完,如果上述操作你都能看懂,恭喜你已成爲數據倉庫之拉鍊表新星一枚,後續會繼續更新關於大數據方面的知識,歡迎關注,評論與我交流,如文章有錯誤之處,還請指正~~

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