1. 程式人生 > 其它 >資料倉庫(10)數倉拉鍊表開發例項

資料倉庫(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)數倉拉鍊表開發例項