大数据仓库之拉链表讲解与举例说明【基础部分】
開門見山,直接切入正題(跟著思路走~~~):
一、.什么是拉鏈表?
維護歷史狀態,以及最新狀態數據的一種表,拉鏈表根據拉鏈粒度的不同,實際上相當于快照,只不過做了優化,去除了一部分不變的記錄,通過拉鏈表可以很方便的還原出拉鏈時點的操作記錄。(可能不是很理解,往下走~~)
二、為什么要使用拉鏈表?
在數據倉庫中,由于源系統每日會有數據變動,比如新增、修改、刪除,如果對每一條記錄數據倉庫都進行存儲,會出現大量重復冗余數據,這樣會增加不必要的存儲空間,而且會使系統處理效率變低。那么,我們如果采用拉鏈表形式存儲,對數據進行加工,對數據進行開鏈(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號的數據一致),拉鏈表中數據不變;
關于拉鏈表的基礎講解已經講完,如果上述操作你都能看懂,恭喜你已成為數據倉庫之拉鏈表新星一枚,后續會繼續更新關于大數據方面的知識,歡迎關注,評論與我交流,如文章有錯誤之處,還請指正~~
總結
以上是生活随笔為你收集整理的大数据仓库之拉链表讲解与举例说明【基础部分】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [201011][Maven 实战][许
- 下一篇: 你的六岁在玩儿泥巴,他们六岁已经在讲算法