關(guān)于數(shù)據(jù)倉庫的分層,似乎大家都有一個(gè)共同的認(rèn)識。但涉及到每一層該如何去建模,可能每個(gè)人都有自己的理解。數(shù)據(jù)建模,毫無疑問是數(shù)倉建設(shè)的重中之重,然后,在實(shí)際的開發(fā)過程中,會把大量的時(shí)間都投入到了需求開發(fā),往往會忽略數(shù)據(jù)建模(尤其是DWS層的建模),長此以往,數(shù)據(jù)模型變的越來越雜亂,指標(biāo)口徑無法統(tǒng)一,造成的結(jié)果就是:雖然表很多,但是卻很難取數(shù)。本文主要介紹DWS層建模的基本方法論,希望對你有所幫助。
數(shù)倉為什么要分層
合理的數(shù)據(jù)倉庫分層一方面能夠降低耦合性,提高重用性,可讀性可維護(hù)性,另一方面也能提高運(yùn)算的效率,影響到數(shù)據(jù)需求迭代的速度,近而影響到產(chǎn)品決策的及時(shí)性。建立數(shù)據(jù)分層可以提煉公共層,避免煙囪式開發(fā),可見一個(gè)合適且合理的數(shù)倉分層是極其重要。
通用分層設(shè)計(jì)思路
- ODS:操作型數(shù)據(jù)(Operational Data Store),指結(jié)構(gòu)與源系統(tǒng)基本保持一致的增量或者全量數(shù)據(jù)。作為DW數(shù)據(jù)的一個(gè)數(shù)據(jù)準(zhǔn)備區(qū),同時(shí)又承擔(dān)基礎(chǔ)數(shù)據(jù)記錄歷史變化,之所以保留原始數(shù)據(jù)和線上原始數(shù)據(jù)保持一致,方便后期數(shù)據(jù)核對需要。
- CDM:通用數(shù)據(jù)模型,又稱為數(shù)據(jù)中間層(Common Data Model),包含DWD、DWS、DIM層。
- DWD:數(shù)據(jù)倉庫明細(xì)層數(shù)據(jù)(Data Warehouse Detail)。對ODS層數(shù)據(jù)進(jìn)行清洗轉(zhuǎn)化,以業(yè)務(wù)過程作為建模驅(qū)動,基于每個(gè)具體的業(yè)務(wù)過程特點(diǎn),構(gòu)建最細(xì)粒度的明細(xì)事實(shí)表。可以結(jié)合企業(yè)的數(shù)據(jù)使用特點(diǎn),基于維度建模思想,將明細(xì)事實(shí)表的某些重要屬性字段做適當(dāng)冗余,也即寬表化處理,構(gòu)建明細(xì)寬表。
- DWS:數(shù)據(jù)倉庫匯總層數(shù)據(jù)(Data Warehouse Summary),基于指標(biāo)需求,構(gòu)建初步匯總事實(shí)表,一般是寬表?;谏蠈拥膽?yīng)用和產(chǎn)品的指標(biāo)需求,構(gòu)建公共粒度的匯總指標(biāo)表。以寬表化手段物理化模型,構(gòu)建命名規(guī)范、口徑一致的統(tǒng)計(jì)指標(biāo),為上層提供公共指標(biāo)。
- DIM:建立一致數(shù)據(jù)分析維表,可以降低數(shù)據(jù)計(jì)算口徑不統(tǒng)一的風(fēng)險(xiǎn),同時(shí)可以方便進(jìn)行交叉探查。以維度作為建模驅(qū)動,基于每個(gè)維度的業(yè)務(wù)含義,通過添加維度屬性、關(guān)聯(lián)維度等定義計(jì)算邏輯,完成屬性定義的過程并建立一致的數(shù)據(jù)分析維表。
- ADS:面向應(yīng)用的數(shù)據(jù)服務(wù)層(Application Data Service)。整合匯總成分析某一個(gè)主題域的服務(wù)數(shù)據(jù),面向應(yīng)用邏輯的數(shù)據(jù)加工。該層主要存放數(shù)據(jù)產(chǎn)品個(gè)性化的統(tǒng)計(jì)指標(biāo)數(shù)據(jù),這一層的數(shù)據(jù)直接對接數(shù)據(jù)的消費(fèi)者,是產(chǎn)品、運(yùn)營等角色可以直接感知理解的一層,大多數(shù)這一層的表都可以直接在BI上通過圖表的形式直接透出。
沒有DWS層不行嗎
當(dāng)我們在做數(shù)據(jù)需求時(shí),會不會有這樣的疑問:我直接能從DWD層很方便的取出想要的數(shù)據(jù),為什么還要多此一舉建立DWS層的匯總表呢?那是不是意味著可以不用建立DWS層的表呢,答案是:可以的。但是這有一個(gè)前提,就是業(yè)務(wù)場景不復(fù)雜。從短期來看可以快速滿足數(shù)據(jù)需求的開發(fā),但是長期來看,會存在如下的問題:
- 對于復(fù)雜的業(yè)務(wù)場景而言,會出現(xiàn)很多跨域、跨事實(shí)的交叉探查,如果沒有沉淀出DWS層的指標(biāo)進(jìn)行統(tǒng)一口徑的收口,那么相同的指標(biāo)會出現(xiàn)不同的口徑和命名,其后果就是取數(shù)變得越來越不方便,而且容易造成業(yè)務(wù)懷疑數(shù)據(jù)是否正確的尷尬局面。
- 公共指標(biāo)沒有統(tǒng)一計(jì)算,當(dāng)每次需要相同的指標(biāo)時(shí),則需要重新計(jì)算一遍取數(shù)邏輯,不僅效率不高(需要關(guān)聯(lián)表,計(jì)算指標(biāo)),而且會造成計(jì)算資源浪費(fèi)。
DWS層設(shè)計(jì)
以分析的主題對象作為建模驅(qū)動,基于上層的應(yīng)用和產(chǎn)品的指標(biāo)需求,構(gòu)建公共粒度的匯總指標(biāo)表。以寬表化手段物理化模型,構(gòu)建命名規(guī)范、口徑一致的統(tǒng)計(jì)指標(biāo),為上層提供公共指標(biāo),建立匯總寬表。如:形成日,周,月粒度匯總明細(xì),或者基于某一個(gè)維度,如商品類目粒度的匯總?cè)毡?,統(tǒng)計(jì)便于下一步報(bào)表數(shù)據(jù)結(jié)構(gòu)的組織。
DWS層的基本特點(diǎn)
- DWS層是面向分析維度進(jìn)行設(shè)計(jì)的,分析維度通常是業(yè)務(wù)經(jīng)常需要的看數(shù)據(jù)的角度。
- DWS層的表服務(wù)于數(shù)據(jù)報(bào)表和數(shù)據(jù)產(chǎn)品的指標(biāo)需求
- ADS層的指標(biāo)數(shù)據(jù)會存在交叉探查的情況,所以DWS層的指標(biāo)要保持命名和口徑一致,避免ADS層的指標(biāo)數(shù)據(jù)混亂
- DWS是公共匯總層,提供不同維度的統(tǒng)計(jì)指標(biāo),指標(biāo)的口徑要保持一致,并且要提供詳細(xì)的描述
- 以寬表的形式進(jìn)行設(shè)計(jì),比如相同粒度的統(tǒng)計(jì)指標(biāo)可以放在一起,避免創(chuàng)建太多的表
- 公共匯總層的一個(gè)表通常會對應(yīng)一個(gè)派生指標(biāo)
- DWS存儲派生指標(biāo)(統(tǒng)計(jì)周期+修飾詞+統(tǒng)計(jì)粒度+原子指標(biāo)),原子指標(biāo)存儲在DWD層的事實(shí)表中
原子指標(biāo)與派生指標(biāo)
所謂原子指標(biāo),即是業(yè)務(wù)過程的度量,就是明細(xì)事實(shí)表中的度量值。比如訂單表,那么某個(gè)訂單對應(yīng)的訂單金額就是一個(gè)原子指標(biāo),這個(gè)指標(biāo)是伴隨著訂單的業(yè)務(wù)過程而產(chǎn)生的。
所謂派生指標(biāo),即由統(tǒng)計(jì)周期+修飾詞+統(tǒng)計(jì)粒度+原子指標(biāo)組合加工而成的指標(biāo)
其中,統(tǒng)計(jì)周期:指的是想要統(tǒng)計(jì)的時(shí)間周期,比如天、周、月
**修飾詞**:指的是業(yè)務(wù)的約束,**通常出現(xiàn)在SQL的where條件中**,比如訂單的下單渠道等等 **統(tǒng)計(jì)粒度**:指的是維度組合,**通常出現(xiàn)在SQL的group by中**,比如統(tǒng)計(jì)商品一級類目對應(yīng)的銷售額,那一級類目就是統(tǒng)計(jì)粒度
DWS層的設(shè)計(jì)原則
關(guān)于匯總層的表建模應(yīng)遵循以下的原則:
- 數(shù)據(jù)公用性比如,匯總的聚集表能否與他人公用?基于某個(gè)維度的聚集是否是數(shù)據(jù)分析或者報(bào)表中經(jīng)常使用的?如果滿足這些情況,我們就有必要把明細(xì)數(shù)據(jù)沉淀到匯總表中。
- 不跨數(shù)據(jù)域數(shù)據(jù)域是在較高層次上對數(shù)據(jù)進(jìn)行分類聚集的抽象,如交易統(tǒng)一劃到交易域下,商品的新增、修改放到商品域下。
- 區(qū)分統(tǒng)計(jì)周期表命名上要能說明數(shù)據(jù)的統(tǒng)計(jì)周期,如_1d 表示最近1天,_td 截止到當(dāng)天,_nd 表示最近N天。
- 避免多個(gè)層級的數(shù)據(jù)應(yīng)該避免將不同層級的數(shù)據(jù)放在一起,比如,如果存在7天和30天的事實(shí),我們可以選擇用兩列存放7天和30天的事實(shí),但是需要在列名和字段注釋上說明清楚。同時(shí)我們也可以使用兩張表分別存儲不同統(tǒng)計(jì)周期的數(shù)據(jù)加以區(qū)分。
- 聚集是不跨越事實(shí)的聚集是針對原始星型模型進(jìn)行的匯總,為了獲取和查詢原始模型一致的結(jié)果,聚集的維度和度量必須與原始模型保持一致,因此聚集是不跨事實(shí)的。橫向鉆取(交叉探查)是針對多個(gè)事實(shí)基于一致性維度進(jìn)行的分析,很多時(shí)候采用融合事實(shí)表,預(yù)先存放橫向鉆取的結(jié)果,從而提高查詢性能。因此融合事實(shí)表是一種導(dǎo)出模式而不是聚集。
DWS層設(shè)計(jì)步驟
- 首先,確定聚集維度,即確定統(tǒng)計(jì)粒度,比如商品粒度
- 然后,確定統(tǒng)計(jì)周期,比如天
- 最后,確定聚集事實(shí),即派生指標(biāo)
CREATE TABLE IF NOT EXISTS dws_asale_trd_itm_ord_1d
(
item_id BIGINT COMMENT '商品ID',
item_title STRING COMMENT '商品名稱',
cate_id BIGINT COMMENT '商品類目ID',
cate_name STRING COMMENT '商品類目名稱',
mord_prov STRING COMMENT '收貨人省份',
confirm_paid_amt_sum_1d DOUBLE COMMENT '最近一天訂單已經(jīng)確認(rèn)收貨的金額總和'
)
COMMENT '商品粒度交易最近一天匯總事實(shí)表'
PARTITIONED BY (ds STRING COMMENT '分區(qū)字段YYYYMMDD')
;
關(guān)于DWS層建設(shè)的一些問題
為什么一張DWS表通常只會對應(yīng)一個(gè)派生指標(biāo)?
在設(shè)計(jì)DWS表的時(shí)候,很多人會把所有可以聚合的維度進(jìn)行cube,這樣就得到了很多個(gè)派生指標(biāo),而這些派生指標(biāo)放在同一張表中無疑會增加這張表的使用難度,比如在實(shí)際的取數(shù)時(shí),往往只關(guān)心某個(gè)統(tǒng)計(jì)粒度的指標(biāo)。實(shí)際上cube的數(shù)據(jù)盡量放在ADS層,這樣在開發(fā)數(shù)據(jù)接口或者應(yīng)用層取數(shù)時(shí)都會比較方便。所以在設(shè)計(jì)DWS層時(shí),應(yīng)當(dāng)遵循前文提到的一些原則,一言以蔽之,就是設(shè)計(jì)盡量體現(xiàn)出公共性、使用簡單并且用戶很容易理解。
怎么設(shè)計(jì)出完美的DWS層表?
數(shù)倉建設(shè)是一個(gè)不斷迭代的過程,數(shù)據(jù)建模同樣是一個(gè)不斷迭代的過程。同時(shí),業(yè)務(wù)是不斷變化的,建模人員對業(yè)務(wù)的理解也是變化的,這些也就注定了建模是一個(gè)迭代過程。雖然存在這些變化,但我們在數(shù)據(jù)建模的時(shí)候同樣要遵循一定的規(guī)范,切不可隨心所欲。
如何評價(jià)DWS層建設(shè)的好壞?
由于數(shù)倉的建設(shè)是與業(yè)務(wù)息息相關(guān)的,數(shù)倉建設(shè)的方法論僅僅只是指引我們構(gòu)建數(shù)倉的一個(gè)方向,在實(shí)際的落地執(zhí)行過程中會存在各種各樣的問題,且不可被這些理論所禁錮。簡單一句話就是:合適就好。所以,評價(jià)模型的好壞與否,更多的是從使用者的角度出發(fā),比如簡單、易于取數(shù)、表的數(shù)量恰好。
總結(jié)
本文主要介紹了數(shù)據(jù)倉庫中DWS建設(shè)的基本思路,包括DWS層的特點(diǎn)、設(shè)計(jì)原則以及設(shè)計(jì)步驟,并對DWS層建設(shè)存在的一些問題進(jìn)行了闡述。當(dāng)然,這些只是DWS層建模的一些方法論,智者見智仁者見仁,在實(shí)際的數(shù)據(jù)建模過程中可以參考這些方法論,但也要注意與具體的業(yè)務(wù)場景相結(jié)合,數(shù)據(jù)建模是建立在自己對業(yè)務(wù)的理解基礎(chǔ)之上的,切不可一味地照搬,要靈活運(yùn)用。另外,不要苛求建立完美的數(shù)據(jù)模型,應(yīng)當(dāng)追求簡單、方便、易用。換句話說,建模沒有對錯(cuò)之分,合適就好。
公眾號【大數(shù)據(jù)技術(shù)與數(shù)倉】首發(fā),關(guān)注領(lǐng)取資料