数仓理论及建模方法
1. 數(shù)倉概述
數(shù)據(jù)倉庫: 數(shù)據(jù)倉庫是一個面向主題的、集成的、非易失的、隨時間變化的數(shù)據(jù)集合。重要用于組織積累的歷史數(shù)據(jù),并且使用分析方法(OLAP、數(shù)據(jù)分析)進(jìn)行分析整理,進(jìn)而輔助決策,為管理者、企業(yè)系統(tǒng)提供數(shù)據(jù)支持,構(gòu)建商業(yè)智能。
面向主題:為數(shù)據(jù)分析提供服務(wù),根據(jù)主題將原始數(shù)據(jù)集合在一起。
集成的:原始數(shù)據(jù)來源于不同的數(shù)據(jù)源,要整合成最終數(shù)據(jù),需要經(jīng)過 ETL(抽取、清洗、轉(zhuǎn)換)的過程。
非易失:保存的數(shù)據(jù)是一系列歷史快照,不允許被修改,只允許通過工具進(jìn)行查詢、分析。
時變性:數(shù)倉會定期接收、集成新的數(shù)據(jù),從而反映出數(shù)據(jù)的最新變化。
數(shù)據(jù)倉庫 VS 數(shù)據(jù)庫
數(shù)據(jù)庫面向事務(wù)設(shè)計,屬于OLTP(在線事務(wù)處理)系統(tǒng),主要操作是隨機(jī)讀寫,在設(shè)計時盡量避免冗余,采用符合范式規(guī)則來設(shè)計。
數(shù)據(jù)倉庫是面向主題設(shè)計的,屬于 OLAP(在線分析處理)系統(tǒng),主要操作是批量讀寫,關(guān)注數(shù)據(jù)整合,以及分析、處理性能;會有意引入冗余,采用反范式方式設(shè)計。
| 面向 | 事務(wù) | 分析 |
| 數(shù)據(jù)類型 | 細(xì)節(jié)、業(yè)務(wù) | 綜合、清洗過的數(shù)據(jù) |
| 數(shù)據(jù)特點(diǎn) | 當(dāng)前的、最新的 | 歷史的、跨時間維護(hù) |
| 目的 | 日常操作 | 長期信息需求、決策支持 |
| 設(shè)計模式 | 基于 ER 模型,面向應(yīng)用 | 星形 / 雪花模型,面向主題 |
| 操作 | 讀 / 寫 | 大多為讀 |
| 數(shù)據(jù)規(guī)模 | GB ~ TB | >= TB |
2. 數(shù)倉分層
數(shù)倉分層:
數(shù)據(jù)應(yīng)用層(ADS,Application Data Store)
數(shù)據(jù)主題層(DWT,Data Warehouse Topic)
數(shù)據(jù)匯總層(DWS,Data Warehouse Summary)
明細(xì)數(shù)據(jù)層(DWD,Data Warehouse Detail)
原始數(shù)據(jù)層(ODS,Operation Data Store)
數(shù)倉為什么分層
-
隔離原始數(shù)據(jù):不論是數(shù)據(jù)異常還是數(shù)據(jù)的敏感性,使真實(shí)數(shù)據(jù)與統(tǒng)計數(shù)據(jù)解耦開
-
把復(fù)雜問題簡單化:將復(fù)雜任務(wù)分解多層,每層處理簡單的任務(wù),方便定位各位問題
-
減少重復(fù)開發(fā):規(guī)范數(shù)據(jù)分層,通過中間層數(shù)據(jù),能夠減少大量重復(fù)計算,增加一次計算結(jié)果的復(fù)用性
ETL 流程:
ETL – Extract - Transform - Load
構(gòu)建數(shù)據(jù)倉庫的重要一環(huán),用戶從數(shù)據(jù)源抽取出所需的數(shù)據(jù),經(jīng)過數(shù)據(jù)清洗,最終按照預(yù)先定義好的數(shù)據(jù)倉庫模型,將數(shù)據(jù)加載到數(shù)據(jù)倉庫中去。
數(shù)據(jù)抽取
- 抽取的數(shù)據(jù)源可以分為結(jié)構(gòu)化數(shù)據(jù)、非結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù)
- 結(jié)構(gòu)化數(shù)據(jù)一般采用 JDBC、數(shù)據(jù)庫日志方式,非 / 半結(jié)構(gòu)化數(shù)據(jù)會監(jiān)聽文件變動。
抽取方式
- 數(shù)據(jù)抽取方式有全量同步、增量同步兩種方式
- 全量同步會將全部數(shù)據(jù)進(jìn)行抽取,一般用于初始化數(shù)據(jù)裝載
- 增量同步方式會檢測數(shù)據(jù)的變動,抽取發(fā)生變動的數(shù)據(jù),一般用于數(shù)據(jù)更新
數(shù)據(jù)轉(zhuǎn)換
- 數(shù)據(jù)轉(zhuǎn)換需要經(jīng)歷數(shù)據(jù)清洗、轉(zhuǎn)換兩個階段
- 數(shù)據(jù)清洗:對出現(xiàn)的重復(fù)、二義性、不完整、違反業(yè)務(wù)或邏輯規(guī)則等問題的數(shù)據(jù)進(jìn)行統(tǒng)一的處理
- 數(shù)據(jù)轉(zhuǎn)換:對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,進(jìn)行字段、數(shù)據(jù)類型、數(shù)據(jù)定義的轉(zhuǎn)換
- 結(jié)構(gòu)化數(shù)據(jù)在轉(zhuǎn)換過程中的邏輯較為簡單,非 / 半結(jié)構(gòu)化數(shù)據(jù)的轉(zhuǎn)換較為復(fù)雜
數(shù)據(jù)加載
- 將最后處理完的數(shù)據(jù)導(dǎo)入到對應(yīng)的目標(biāo)源里
ETL 策略
全量同步:
- 數(shù)據(jù)初始化裝載時,一定使用全量同步的方式
- 使用全量同步的方式做周期數(shù)據(jù)更新,直接覆蓋原有數(shù)據(jù)即可
增量同步:
- 傳統(tǒng)數(shù)據(jù)整合方案中,大多采用 merger 方式(insert+update)
- 主流大數(shù)據(jù)平臺不支持 update 操作,可采用全外連接 + 數(shù)據(jù)全量覆蓋方式(如果能 join 到說明歷史有該數(shù)據(jù),則為變化數(shù)據(jù);如果join不到,則為新增數(shù)據(jù))
如果擔(dān)心數(shù)據(jù)更新出錯,可以采用分區(qū)方式,每天保存最新的全量版本,保留較短周期。
操作數(shù)據(jù)層(ODS)
- 數(shù)據(jù)與原業(yè)務(wù)數(shù)據(jù)保持一致,可以通過增加字段方式對數(shù)據(jù)整理
- 業(yè)務(wù)系統(tǒng)對歷史數(shù)據(jù)完成修改后,在字段中進(jìn)行標(biāo)識,而不覆蓋元數(shù)據(jù)。
- 存儲的歷史數(shù)據(jù)是只讀的,提供業(yè)務(wù)系統(tǒng)查詢使用
- 在離線數(shù)倉中,業(yè)務(wù)數(shù)據(jù)定期提供 ETL 流程導(dǎo)入到 ODS 中,導(dǎo)入方式有全量、增量。
數(shù)據(jù)明細(xì)層(DWD)
- 數(shù)據(jù)明細(xì)層對 ODS 層的數(shù)據(jù)進(jìn)行清洗、標(biāo)準(zhǔn)化、維度退化(時間、分類、地域)
- 滿足 3NF 模型,用于數(shù)據(jù)分析
數(shù)據(jù)匯總層(DWS)
- 對 DWD 層的數(shù)據(jù),按照主題進(jìn)行計算匯總,存放的是便于分析的寬表
- 非 3NF,注重數(shù)據(jù)聚合
數(shù)據(jù)應(yīng)用層(ADS)
- 數(shù)據(jù)應(yīng)用層也被稱為數(shù)據(jù)集市
- 存儲數(shù)據(jù)分析結(jié)果,為不同業(yè)務(wù)場景提供接口,減輕數(shù)據(jù)倉庫的負(fù)擔(dān)
- 為數(shù)據(jù)應(yīng)用層的報表決策、并發(fā)查詢、搜索檢索提供支持
3. 模型分類
OLTP(在線事務(wù)處理)系統(tǒng)中,主要操作是隨機(jī)讀寫,為了保證數(shù)據(jù)一致性、減少冗余、常使用關(guān)系模型,滿足第三范式。
OLAP(在線聯(lián)機(jī)分析)系統(tǒng)中,主要操作是復(fù)雜的分析查詢;關(guān)注數(shù)據(jù)整合,以及分析、處理性能。
OLAP 按照數(shù)據(jù)存儲方式的不同,可分為 ROLAP、MOLAP、HOLAP。
ROLAP(關(guān)系型 OLAP,Relation OLAP):使用關(guān)系模型構(gòu)建,存儲系統(tǒng)一般為 RDBMS
MOLAP(多維性 OLAP,Multidimensional OLAP):預(yù)先聚合計算,使用多維數(shù)組的形式保存數(shù)據(jù)結(jié)果,加快查詢分析時間
HOLAP(混合架構(gòu)的 OLAP,Hybrid OLAP):兩者的集成,如底層是關(guān)系模型,高層是多為矩陣型;查詢效率高于 ROLAP,低于 MOLAP
ROLAP 系統(tǒng)建模
ROLAP:ER 模型、維度模型、Data Value、Anchor
- ER 模型:
- 出發(fā)點(diǎn)是整合數(shù)據(jù),為數(shù)據(jù)分析決策提供服務(wù)
- 需要全面了解業(yè)務(wù)和數(shù)據(jù)
- 實(shí)施周期長
- 對建模人員能力要求高
- 維度模型:
- 為分析需求服務(wù),更快完成需求分析
- 具有較大規(guī)模復(fù)雜查詢的響應(yīng)性能
- 最流行的數(shù)倉建模方法
- Data Value
- ER 模型的衍生
- 強(qiáng)調(diào)數(shù)據(jù)的歷史性、可追溯性、原子性
- 弱化一致性處理和整合
- 引入范式,應(yīng)對源系統(tǒng)的擴(kuò)展性
- Anchor
- Data Value 模型的衍生
- 初衷為設(shè)計一個高度擴(kuò)展模型
- 會帶來較多的 join 操作
維度模型
維度模型的分類
星型模型:維度只有一層,分析性能最優(yōu)
雪花模型:具有多層維度,比較接近 3NF,較為靈活
星座模型:基于多個事實(shí)表,事實(shí)表之間會共享一些維度表
模型選擇:優(yōu)先考慮星型模型
維度模型表的分類
事實(shí)表:
- 一個現(xiàn)實(shí)存在的業(yè)務(wù)對象,每行數(shù)據(jù)代表一個業(yè)務(wù)事件。
維度表:
- 對事實(shí)的描述信息。
- 每一張維度表對應(yīng)現(xiàn)實(shí)世界中的一個對象或者概念,如用戶、商品、日期、地區(qū)。
- 通常使用維度對事實(shí)表中的數(shù)據(jù)進(jìn)行統(tǒng)計、聚合運(yùn)算。
事務(wù)事實(shí)表:
- 以每個事務(wù)或事件為單位,隨著業(yè)務(wù)不斷產(chǎn)生的數(shù)據(jù),一旦產(chǎn)生不會再變化,比如交易流水、操作日志、出庫入庫記錄。
周期快照事實(shí)表:
-
不會保留所有數(shù)據(jù),只保留固定時間間隔的數(shù)據(jù)。
-
隨著業(yè)務(wù)周期的推進(jìn)而變化,可完成間隔周期內(nèi)的度量統(tǒng)計,比如年、季度累計。
-
使用周期+狀態(tài)度量的組合,如年累計訂單數(shù)(年是周期、訂單總戶數(shù)是度量)。
累計快照事實(shí)表:
-
用于跟蹤業(yè)務(wù)事實(shí)的變化。
-
記錄不確定周期的度量統(tǒng)計,完全覆蓋一個事實(shí)的生命周期,如訂單狀態(tài)。
-
通常具有多個時間字段,用于記錄生命周期中關(guān)鍵的時間點(diǎn)(如下單時間、支付時間、確認(rèn)收貨時間)。
實(shí)現(xiàn)方式一
使用日期分期表,全量數(shù)據(jù)記錄,每天的分區(qū)存儲昨天全量數(shù)據(jù)與當(dāng)天的增量數(shù)據(jù)合并的結(jié)果
數(shù)據(jù)量大會導(dǎo)致全量表膨脹,存儲大量永遠(yuǎn)不更新的冷數(shù)據(jù),降低性能
使用于數(shù)據(jù)量少的情況
實(shí)現(xiàn)方式二
使用日期分期表,推測數(shù)據(jù)最長生命周期,存儲周期內(nèi)數(shù)據(jù);周期外的冷數(shù)據(jù)存儲到歸檔表
需要保留多天的分區(qū)數(shù)據(jù),存儲消耗依然很大
實(shí)現(xiàn)方式三
使用日期分區(qū)表,以業(yè)務(wù)實(shí)體的結(jié)束時間分區(qū),每天的分區(qū)存放當(dāng)天結(jié)束的數(shù)據(jù);設(shè)計一個時間非常大的分區(qū),如 9999-12-31,存放截至當(dāng)前未結(jié)束的數(shù)據(jù)
已結(jié)束的數(shù)據(jù)存放到相應(yīng)的分區(qū),存放未結(jié)束數(shù)據(jù)分區(qū),數(shù)據(jù)量不會太大,ETL 性能好
無存儲浪費(fèi),數(shù)據(jù)全局唯一
業(yè)務(wù)系統(tǒng)可能無法標(biāo)識業(yè)務(wù)實(shí)體的結(jié)束時間,可以使用其他相關(guān)業(yè)務(wù)系統(tǒng)的結(jié)束標(biāo)志作為此業(yè)務(wù)系統(tǒng)的結(jié)束,也可以使用最長生命周期時間或者前端系統(tǒng)的數(shù)據(jù)歸檔時間
拉鏈表:
- 記錄每條信息的生命周期,用于保留數(shù)據(jù)的所有歷史(變更)狀態(tài)
- 拉鏈表將表數(shù)據(jù)的隨機(jī)修改方式,變?yōu)轫樞蜃芳?/li>
寬表模型
寬表模型是維度模型的衍生,適合 join 性能不佳的數(shù)倉產(chǎn)品。寬表模型是將維度冗余到事實(shí)表中,形成寬表,依次減少 join 操作。
寬表出現(xiàn)在DWD層、DWS層,由于寬表是將不同的內(nèi)容組合到一張表中,所以寬表不滿足范式要求,但是再增加冗余的同時提高了查新的性能(減少 join)。
MOLAP 系統(tǒng)建模
MOLAP 將數(shù)據(jù)進(jìn)行預(yù)結(jié)算,并將數(shù)據(jù)結(jié)構(gòu)存儲到 CUBE 模型中。MOLAP 產(chǎn)品:Kylin、Druid
CUBE 模型以多維數(shù)組的形式,物化到存儲系統(tǒng)中,加快后續(xù)的查詢。生成 CUBE 需要大量的時間、空間,維度預(yù)處理可能會導(dǎo)致數(shù)據(jù)膨脹。
MOLAP 對復(fù)雜查詢操作做了直觀的定義,包括鉆取、切片、切塊、旋轉(zhuǎn)。
鉆取:
鉆取是對不同層次的分析,通過改變維度的層次來變化分析的粒度。
鉆取包括上卷(Roll-up)、下鉆(Drill-down)。
- 上卷:向上鉆取,指從底層次到高層次的卻換
- 下鉆:指從高層次到低層次的切換
切片(Slice):
選擇某個維度進(jìn)行分隔稱為切片
切塊(Dice):
按照多維進(jìn)行的切片稱為切塊
旋轉(zhuǎn)(Pivot):
對維度方向的互換,類似于交換坐標(biāo)軸上卷。
[外鏈圖片轉(zhuǎn)存中…(img-uQis5F2c-1645262440294)]
范式
第一范式:屬性不可分割
第二范式:消除不分函數(shù)依賴
第三范式:消除傳遞依賴
關(guān)系建模與維度建模
關(guān)系建模:將復(fù)雜的數(shù)據(jù)抽象為兩個概念——實(shí)體和關(guān)系,并使用規(guī)范化的方式表示出來。
維度建模:模型相對清晰、簡潔。維度模型以數(shù)據(jù)分析作為出發(fā)點(diǎn),不遵循三范式,故數(shù)據(jù)存在一定的冗余。維度模型面向業(yè)務(wù),將業(yè)務(wù)用事實(shí)表和維度表呈現(xiàn)出來。
4. 數(shù)倉建模方法
ODS:
- 數(shù)據(jù)類型:用戶行為數(shù)據(jù)、業(yè)務(wù)數(shù)據(jù)
- 規(guī)劃處理
- 保持?jǐn)?shù)據(jù)源不做修改,起到備份數(shù)據(jù)的作用
- 數(shù)據(jù)采用壓縮,減少磁盤存儲空間
- 創(chuàng)建分區(qū)表,防止后續(xù)的全表掃描
DWD:
DWD層需構(gòu)建維度模型,一般采用星型模型,呈現(xiàn)的狀態(tài)一般為星座模型。
維度建模一般按照以下四個步驟:選擇業(yè)務(wù)過程→聲明粒度→確認(rèn)維度→確認(rèn)事實(shí)。
- 選擇業(yè)務(wù)過程
- 在業(yè)務(wù)系統(tǒng)中,挑選我們感興趣的業(yè)務(wù)線,比如下單業(yè)務(wù),支付業(yè)務(wù),退款業(yè)務(wù),物流業(yè)務(wù),一條業(yè)務(wù)線對應(yīng)一張事實(shí)表。
- 聲明粒度
- 數(shù)據(jù)粒度指數(shù)據(jù)倉庫的數(shù)據(jù)中保存數(shù)據(jù)的細(xì)化程度或綜合程度的級別。
- 聲明粒度意味著精確定義事實(shí)表中的一行數(shù)據(jù)表示什么,應(yīng)該盡可能選擇最小粒度,以此來應(yīng)各種各樣的需求。
- 確認(rèn)維度
- 確定維度的原則是:后續(xù)需求中是否要分析相關(guān)維度的指標(biāo)。例如,需要統(tǒng)計,什么時間下的訂單多,哪個地區(qū)下的訂單多,哪個用戶下的訂單多。需要確定的維度就包括:時間維度、地區(qū)維度、用戶維度。
- 確認(rèn)事實(shí)
- 此處的“事實(shí)”一詞,指的是業(yè)務(wù)中的度量值(次數(shù)、個數(shù)、件數(shù)、金額,可以進(jìn)行累加),例如訂單金額、下單次數(shù)等。
- 在DWD層,以業(yè)務(wù)過程為建模驅(qū)動,基于每個具體業(yè)務(wù)過程的特點(diǎn),構(gòu)建最細(xì)粒度的明細(xì)層事實(shí)表。事實(shí)表可做適當(dāng)?shù)膶挶砘幚怼?/li>
DWD層是以業(yè)務(wù)過程為驅(qū)動。
DWS層、ADS層都是以需求為驅(qū)動,和維度建模已經(jīng)沒有關(guān)系了。
DWS層建寬表,按照主題去建表。主題相當(dāng)于觀察問題的角度,對應(yīng)著維度表。
DWS:
DWS稱寬表層,這兩層的設(shè)計思想大致相同,通過以下案例進(jìn)行闡述。
-
問題引出:兩個需求,統(tǒng)計每個省份訂單的個數(shù)、統(tǒng)計每個省份訂單的總金額
-
處理辦法:都是將省份表和訂單表進(jìn)行join,group by省份,然后計算。同樣數(shù)據(jù)被計算了兩次,實(shí)際上類似的場景還會更多。
那怎么設(shè)計能避免重復(fù)計算呢?
針對上述場景,可以設(shè)計一張地區(qū)寬表,其主鍵為地區(qū)ID,字段包含為:下單次數(shù)、下單金額、支付次數(shù)、支付金額等。上述所有指標(biāo)都統(tǒng)一進(jìn)行計算,并將結(jié)果保存在該寬表中,這樣就能有效避免數(shù)據(jù)的重復(fù)計算。
- 總結(jié):
- 需要建哪些寬表:以維度為基準(zhǔn)。
- 寬表里面的字段:是站在不同維度的角度去看事實(shí)表,重點(diǎn)關(guān)注事實(shí)表聚合后的度量值。
ADS:
如對電商系統(tǒng)各大主題指標(biāo)分別進(jìn)行分析。
5. 寫在最后
事實(shí)表同步策略:
-
事務(wù)型事實(shí)表:適用于數(shù)據(jù)寫入后不會發(fā)生變化的業(yè)務(wù),增量同步;
-
周期型快照事實(shí)表:只關(guān)心每天、每周(時間間隔)的結(jié)果,每個周期全量同步
-
累積性全量事實(shí)表:適用于會發(fā)生周期性變化的業(yè)務(wù),數(shù)據(jù)多累計寫入(修改),新增及變化同步
DWD層構(gòu)建維度模型策略:
?
???END???
總結(jié)
- 上一篇: 论文记录-2019-Salient ob
- 下一篇: 苹果6如何截屏_手机截屏新方法,点击屏幕