如何優(yōu)雅的設(shè)計(jì)DWS層?
今天和大家聊一個老生常談的話題,如何設(shè)計(jì)DWS層?
對于數(shù)倉的分層,想必大家都不陌生。基于OneData方法論的三層數(shù)倉劃分:數(shù)據(jù)引入層(ODS,Operational Data Store)、數(shù)據(jù)公共層(CDM,Common Dimenions Model)和數(shù)據(jù)應(yīng)用層(ADS,Application Data Store)早就深入人心。
當(dāng)然啦,涉及到每一層具體該怎么開發(fā)、建模,可能大家都有自己的理解。
但好在大家對數(shù)據(jù)建模重要性的認(rèn)識那都是一致的,如果我們把指標(biāo)比作樹上的果實(shí),那么模型就好比是大樹的軀干,想讓果實(shí)結(jié)得好,必須讓樹干變得粗壯。
我們先來回想下,構(gòu)建數(shù)據(jù)中臺的初衷是什么:
缺少可以復(fù)用的數(shù)據(jù) 大家不得不使用原始數(shù)據(jù)進(jìn)行清洗、加工和計(jì)算指標(biāo) 大量重復(fù)代碼的開發(fā)對資源的消耗
問題的根源就在于數(shù)據(jù)模型的無法復(fù)用,以及數(shù)據(jù)開發(fā)都是煙囪式的。所以要解決這個問題,就要搞清楚健壯的數(shù)據(jù)模型該如何設(shè)計(jì)。
Part1常見的數(shù)倉分層設(shè)計(jì)思路
下圖是數(shù)倉分層的邏輯架構(gòu)圖,大家不妨回憶一下數(shù)據(jù)模型的分層設(shè)計(jì):

數(shù)據(jù)引入層(ODS,Operational Data Store,又稱數(shù)據(jù)基礎(chǔ)層):將原始數(shù)據(jù)幾乎無處理地存放在數(shù)據(jù)倉庫系統(tǒng)中,結(jié)構(gòu)上與源系統(tǒng)基本保持一致,是數(shù)據(jù)倉庫的數(shù)據(jù)準(zhǔn)備區(qū)。這一層的主要職責(zé)是將基礎(chǔ)數(shù)據(jù)同步、存儲。 數(shù)據(jù)公共層(CDM,Common Dimenions Model):存放明細(xì)事實(shí)數(shù)據(jù)、維表數(shù)據(jù)及公共指標(biāo)匯總數(shù)據(jù)。其中,明細(xì)事實(shí)數(shù)據(jù)、維表數(shù)據(jù)一般根據(jù)ODS層數(shù)據(jù)加工生成。公共指標(biāo)匯總數(shù)據(jù)一般根據(jù)維表數(shù)據(jù)和明細(xì)事實(shí)數(shù)據(jù)加工生成。CDM層又細(xì)分為維度層(DIM)、明細(xì)數(shù)據(jù)層(DWD)和匯總數(shù)據(jù)層(DWS),采用維度模型方法作為理論基礎(chǔ), 可以定義維度模型主鍵與事實(shí)模型中外鍵關(guān)系,減少數(shù)據(jù)冗余,也提高明細(xì)數(shù)據(jù)表的易用性。在匯總數(shù)據(jù)層同樣可以關(guān)聯(lián)復(fù)用統(tǒng)計(jì)粒度中的維度,采取更多的寬表化手段構(gòu)建公共指標(biāo)數(shù)據(jù)層,提升公共指標(biāo)的復(fù)用性,減少重復(fù)加工。 維度層(DIM,Dimension):以維度作為建模驅(qū)動,基于每個維度的業(yè)務(wù)含義,通過添加維度屬性、關(guān)聯(lián)維度等定義計(jì)算邏輯,完成屬性定義的過程并建立一致的數(shù)據(jù)分析維表。為了避免在維度模型中冗余關(guān)聯(lián)維度的屬性,基于雪花模型構(gòu)建維度表。 明細(xì)數(shù)據(jù)層(DWD,Data Warehouse Detail):以業(yè)務(wù)過程作為建模驅(qū)動,基于每個具體的業(yè)務(wù)過程特點(diǎn),構(gòu)建最細(xì)粒度的明細(xì)事實(shí)表。可將某些重要屬性字段做適當(dāng)冗余,也即寬表化處理。 匯總數(shù)據(jù)層(DWS,Data Warehouse Summary):以分析的主題對象作為建模驅(qū)動,基于上層的應(yīng)用和產(chǎn)品的指標(biāo)需求,構(gòu)建公共粒度的匯總指標(biāo)表。以寬表化手段物理化模型,構(gòu)建命名規(guī)范、口徑一致的統(tǒng)計(jì)指標(biāo),為上層提供公共指標(biāo),建立匯總寬表、明細(xì)事實(shí)表。 數(shù)據(jù)應(yīng)用層(ADS,Application Data Store):存放數(shù)據(jù)產(chǎn)品個性化的統(tǒng)計(jì)指標(biāo)數(shù)據(jù),根據(jù)CDM層與ODS層加工生成。
Part2DWS層很重要?
通常,大家都會有這樣的疑問:明明可以直接從DWD層取數(shù),為什么要多此一舉建立DWS的匯總邏輯表呢?
我想說的是:如果在業(yè)務(wù)場景不復(fù)雜的情況下,那樣做是沒有問題的??梢坏┟鎸?fù)雜的業(yè)務(wù)場景,那這種做法無疑是混亂的根源所在,前面提到的煙囪式開發(fā)、計(jì)算資源的浪費(fèi)等等情況,正是這樣產(chǎn)生的。
舉個例子,我們需要的是從數(shù)據(jù)明細(xì)層中做一個初步的匯總,抽象出來一些通用的維度:時間、用戶ID、IP等,并根據(jù)這些維度做一些統(tǒng)計(jì),比如用戶每個時間段在不同登錄IP購買的商品數(shù)等。
這里做一層輕度的匯總會讓計(jì)算更加的高效,在此基礎(chǔ)上如果計(jì)算僅7天、30天、90天的行為的話會快很多。我們希望80%的業(yè)務(wù)都能通過我們的DWS層計(jì)算,而不是ODS或者DWD層。
Part3應(yīng)該遵循的設(shè)計(jì)原則
聚集是指針對原始明細(xì)粒度的數(shù)據(jù)進(jìn)行匯總。DWS匯總數(shù)據(jù)層是面向分析對象的主題聚集建模,以零售的場景為例,我們最終的分析目標(biāo)為:最近一天某個類目(例如,廚具)商品在各省的銷售總額、該類目銷售額Top10的商品名稱、各省用戶購買力分布。
因此,我們可以以最終交易成功的商品、類目、買家等角度對最近一天的數(shù)據(jù)進(jìn)行匯總。數(shù)據(jù)聚集的注意事項(xiàng)如下:
聚集是不跨越事實(shí)的。聚集是針對原始星形模型進(jìn)行的匯總。為獲取和查詢與原始模型一致的結(jié)果,聚集的維度和度量必須與原始模型保持一致,因此聚集是不跨越事實(shí)的,所以原子指標(biāo)只能基于一張事實(shí)表定義,但是支持原子指標(biāo)組合為衍生原子指標(biāo)。 聚集會帶來查詢性能的提升,但聚集也會增加ETL維護(hù)的難度。當(dāng)子類目對應(yīng)的一級類目發(fā)生變更時,先前存在的、已經(jīng)被匯總到聚集表中的數(shù)據(jù)需要被重新調(diào)整。
此外,進(jìn)行DWS層設(shè)計(jì)時還需遵循數(shù)據(jù)公用性原則。數(shù)據(jù)公用性需要考慮匯總的聚集是否可以提供給第三方使用。我們可以思考基于某個維度的聚集是否經(jīng)常用于數(shù)據(jù)分析中,如果答案是肯定的,就有必要把明細(xì)數(shù)據(jù)經(jīng)過匯總沉淀到聚集表中。
簡單的說就是:
主題 寬表 輕度匯總
Part4圖解DWS層設(shè)計(jì)流程
以電商零售的場景為例,我們已經(jīng)基于ODS層的訂單表、用戶表、商品表、優(yōu)惠券表等,經(jīng)過ETL完成了DWD層的建模,一般是采用星型模型。
這里嚴(yán)格按照:業(yè)務(wù)過程→聲明粒度→確認(rèn)維度→確認(rèn)事實(shí) 完成建模,過程如下:

接下來,便是到了DWS層設(shè)計(jì)的環(huán)節(jié)。按照我們上面的設(shè)計(jì)思路,通過從維度表去看事實(shí)表,便可得出每天的寬表。
這樣即可統(tǒng)計(jì)各個主題對象的當(dāng)天行為,服務(wù)于ADS層的主題寬表以及一些業(yè)務(wù)的明細(xì)數(shù)據(jù),也可以以應(yīng)對一些特殊的需求,例如:購買行為,統(tǒng)計(jì)商品復(fù)購率等。

通過外鍵獲取相關(guān)的度量值,我們整合多個DWD的明細(xì)事實(shí)表度量值來構(gòu)成新表。
在這里,我們還是要遵循上文提到的設(shè)計(jì)原則,在設(shè)計(jì)上盡量體現(xiàn)出公共性、使用簡單并且用戶很容易理解。
Part5思考:如何設(shè)計(jì)出完美的DWS層?
在我們數(shù)據(jù)中臺實(shí)際實(shí)施落地的過程中,團(tuán)隊(duì)不但要建設(shè)公共數(shù)據(jù)層,形成數(shù)據(jù)中臺,還要承擔(dān)著新需求的壓力。
往往我們要先滿足需求(活下去),再研發(fā)公共數(shù)據(jù)層(構(gòu)建美好未來),在滿足業(yè)務(wù)需求的過程中,再根據(jù)需求不斷對模型進(jìn)行迭代和優(yōu)化,隨著時間的推移,越來越多的業(yè)務(wù)需求可以通過DWS層的數(shù)據(jù)完成。
這一過程中,完善度是很好的考核標(biāo)準(zhǔn),主要看DWS層匯總的數(shù)據(jù)能滿足多少的查詢需求,如果匯總數(shù)據(jù)無法滿足需求,使用數(shù)據(jù)的人就必須使用明細(xì)的數(shù)據(jù),甚至是ODS層的原始數(shù)據(jù)。
DWS/ADS層的完善度越高,說明數(shù)據(jù)的上層建設(shè)越完善,而從使用者的角度來說,查詢快、易取數(shù)、用的爽,那才是硬道理。
end ~
咳咳,剛好九點(diǎn)整 ?? 嘀,下班....
最近某個十八線竟然被他的小伙伴催更了,哭泣...
更新慢的原因是最近訂閱了一個專欄,關(guān)于數(shù)據(jù)中臺實(shí)踐的,非常精彩。所以云祁學(xué)的也是非常認(rèn)真,三張思維導(dǎo)圖為證!

不過,文章我還沒開始肝 ??,立個Flag,周末出一篇?
推薦閱讀:
2021-06-15
2021-06-21
2021-06-25
2021-06-23
2021-06-07

我是「云祁」,一枚熱愛技術(shù)、會寫詩的大數(shù)據(jù)開發(fā)猿,歡迎大家關(guān)注呀!
