數據倉庫(10)數倉拉鏈表開發實例
拉鏈表是數據倉庫中特別重要的一種方式,它可以保留數據歷史變化的過程,這裡分享一下拉鏈表具體的開發過程。
維護歷史狀態,以及最新狀態數據的一種表,拉鏈表根據拉鏈粒度的不同,實際上相當於快照,只不過做了優化,去除了一部分不變的記錄,通過拉鏈表可以很方便的還原出拉鏈時點的客戶記錄。
這裡用商品價格的變化作為例子,具體的開發過程要按實際的來,不能照搬程式碼,編程重要的是了解背後的思路和原理,而不是ctrl+c和ctrl+v。那對我們學習提升的幫助有限,雖然可能對完成工作的效率幫助很大。
在開始介紹之前,這裡的數據倉庫的環境是HIVE。
首先看看原始的數據:
可以看到,原始的數據是每一個商品,一條記錄,每一個商品,只保留最新的價格資訊。這裡的拉鏈表,我們做到天粒度的。
我們這裡的思路是這樣的,將最新的商品記錄插入歷史拉鏈表中,然後我們通過HIVE的窗口行數,按照end_date排序,然後分別取下一條的sale_price和end_date,然後再判斷本條的價格和下一條的價格是否相等,如果是一樣的,那麼就把end_date改為下一條的end_date,最後做去重處理,然後就得到我們想要的數據了。
說了這麼多,我覺得還是把sql貼出來會好一些,程式碼是最好的語言。
talk is cheap,show me the code。
-- 商品原始表這裡取名goods_table
select spu_id,
min(start_date) as start_date,
end_date as end_date,
sale_price
from
(select spu_id,
start_date,
if(sale_price = lead_sale_price,lead_end_date,end_date) as end_date,
sale_price
from
( select spu_id,
start_date,
end_date,
sale_price,
lead(sale_price,1,null) over(partition by spu_id order by end_date) as lead_sale_price,
lead(end_date) over(partition by spu_id order by end_date) as lead_end_date
from goods_table ) t) t
group by spu_id,
end_date,
sale_price ;
根據上面的程式碼,跑出來的,就是我們想要的拉鏈表的數據了,看看最後的效果。
使用這種方式即可以記錄歷史,可以最大程度的節省存儲,不會產生過多的冗餘。
參考文章:數據倉庫(10)數倉拉鏈表開發實例