維度建模


 

 

 

 

 

ODS:數據 來源 : 一部分是來自關系型數據庫,符合ER模型 。一部分來自日志 ,清洗成二維表 

DWD: 把所有的數據清理整合 ,規范化 。臟數據清理 ,命名不規范的。最后拿到的是干凈的 ,一致性的數據 。

            把公共維度抽取出來,如區域 

DWS: 維度建模,通用的匯總層 ,為了避免重復計算。 DWS的表底層可能依賴DWD或ODS層的幾十張表。所以從ETL性能出發要考慮DWS層表的數量和依賴 。

DM:指標庫 ,集市是面向分析的

清洗過程: ODS清洗臟數據到DWD, DWD匯總到DWS,DWD到DM做指標。 

 

 

 

維度 :

維度,顧名思義,看待事物的角度。比如時間日期  、區域、部門 、客戶、應用程序等 維度 ,而省、市、縣又叫維度的粒度,粒度可以是一組組合:比如我要看某個省某個市下某個縣年齡在28歲以下的購買能力。
維度表一般為單一主鍵,在ER模型中,實體為客觀存在的事物,會帶有自己的
描述性屬性,屬性一般為文本性、描述性的,這些描述被稱為維度
比如商品,單一主鍵:商品ID,屬性包括產地、顏色、材質、尺寸、單價等,
但並非屬性一定是文本,比如單價、尺寸,均為數值型描述性的,日常主要的維
度抽象包括:時間維度表、地理區域維度表等

 

維度設計:
代理鍵
緩慢漸變維
事實表設計:
明細事實表
聚合事實表

 

代理鍵:
維度表中必須有一個能夠唯一標識一行記錄的列,通過該列維護維度表與事實表之間的關系,一般維度表中業務主鍵符合條件可以當作維度主鍵。

當整合多個數據源的維度時,不同數據源的業務主鍵重復怎么辦?

比如下圖:

原有業務主鍵id,整合后發生重復。此時引入一個新的和業務無關的鍵(代理建),並且在整個維度表中是全局唯一的,而且通常情況下自增的方式來做的

 

 

 

 傳統數據庫有自增id默認功能,但hive中怎么生成自增的代理鍵?

 

表命名規則:
-i結尾: 流水型的純增量的
-d結尾: 快照的
-a結尾: 全量沒有任何分區

維度有分為:
1/ 穩定維度:
如時間,區域等,不發生變化或很少發生變化.針對這種維度,設計維度表時,僅需要完整的數據,不需要天的快照數據,因為當前數據狀態即是歷史數據狀態.
2/ 緩慢漸變緯度
維度數據會隨着時間發生變化,變化速度比較緩慢.由於數據倉庫需要追溯歷史變化,尤其是一些重要的數據,所以歷史狀態也需要采取一定的措施進行保存.
兩種方法:
a. 每天保存等錢數據的全量快照數據,適合數據量較小的維度,使用簡單.
b. 在維度表中添加官軍屬性值的歷史字段,僅保留上一個的狀態值. (復雜,不常用)
c. 拉鏈表
當維度數據發生變化時,將舊數據置為失效,將更改后的數據當作新的記錄,插入到維度表中,並開始生效,這樣就記錄了數據在某種粒度上的變化歷史.

比如: 員工的部門變化

 

因為是對維度表做拉鏈,所以同一維度實體必然存在多條記錄,此時維度表的原子性主鍵就不存在了.如上表中的兩條記錄id都是1

那么拉鏈表怎么和事實表關聯?

引入代理鍵:

 

 問題:事實表來源於業務事務表,代理鍵和業務本身沒有關系,那么怎么在事實表中裝載代理鍵?

D:\數據倉庫\PART3\09 數據倉庫維度建模\數據倉庫維度建模2.mp4

小結:
代理鍵是維度建模中極力推薦的方式,它的應用能有效隔離源端變化帶來的數倉結構不穩定問題,同時也能提高數據檢索性能.
但,代理鍵維護代價非常高,尤其是數據裝載過程中,對事實表帶來較大的影響,如代理鍵的生成、事實表中關聯鍵的裝載、不支持非等值關聯等問題,帶來ETL過程更加復雜。
所以,謹慎使用代理鍵,同時對緩慢漸變維場景,可以考慮每天保留維表全量快照,但這樣會帶來存儲成本,根據實際情況衡量。

 

案例: 

一個事實表,可以拆分成為多個不同的維度  ==》針對不同的維度進行分析。 這就叫多維分析

中間的是主表,右邊是財務關心的,左邊是技術部關心的

 

 時間維度   用戶維度    金額維度    ==》 可以組合出來多少個不同的分析的角度???  

不同的緯度表可以組合關聯分析。

kylin其實就是在做多維的分析 : 通過各種不同的維度都來做聚合的分析

 

事實表設計:
1/ 明細事實表,一般在dwd層
2/ 聚合事實表,一般在dws(輕度匯總)和DM

明細事實表:
事實表有粒度大小之分,一般在dwd層,該層事實表設計部進行聚合、匯總動作,只做數據規范化、數據降維動作,同時數據保持業務事務粒度,確保數據信息無丟失。
數據降緯:
為了提高模型易用性,將常規維度表中的常用的屬性數據冗余到相應的事實表中,從而在使用時避免維表關聯的方式,

如下圖,中間就是事實表,如果要做區域商品購買力分析,把常住地等也放到事實表中,這就是降維的過程。以后在使用事實表時就不用再和維度表再做關聯。

 

 

 

 明細事實表設計:

 

 

 

案例:
出行,用戶下單打車,該訂單的整個流程包括用戶下單、司機接單、司機做單、乘客支付,可能還伴隨有評價、投訴等環節,這個場景的明細表怎么設計?

設計維度,要求業務側記錄這些事實:

 

 

采集成這么一張事實表:

 

事實表的存儲設計: 

 

 

 注意用拉鏈表要是緩慢變化,如果變化特別快,比如每天變一次,那12天就會產生12張拉鏈表,可能存儲量比全量快照還大。

案例: D:\數據倉庫\PART3\09 數據倉庫維度建模\數據倉庫維度建模7.mp4

信用卡場景,由於用戶的信用額度、已用額度存在緩慢的變化,又需要跟蹤變化的記錄,設計相關事實表。

源數據包括用戶id、卡id、已有額度、剩余額度、創建時間、更新時間

 

 

 

聚合事實表: 

 

可累加事實:
在一定的粒度范圍內,可累加的事實度量,比如:訂單金額、訂單數等
不可累加事實:
在更高粒度上不可累加的事實,比如通過率、轉換率、下單用戶。

明細表的不用考慮粒度,它就是最小粒度.

 實例:

按照出行訂單明細事實表,構建數據倉庫上層模型。

解: 

到訂單粒度--->到用戶粒度(粒度粗一些)--->司機粒度

所以從下面表中可以看到:
比如訂單表有2000萬個訂單,可能到用戶表就1500萬個用戶,到司機表就可能更少。所以有了聚合表后,衡量、選擇從哪張表里去計算數據,就不用每天去遍歷所有數據。

 

匯聚用戶畫像用到的表::

日報(時間緯度)
區域

 

 

 

數據集市的設計:
實際上數據倉庫是包括數據集市的,而且物理上是統一、非隔離的。並不是說我們單獨要建一個數據集市,是一個邏輯概念.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM