數(shù)倉建?!獙挶淼脑O(shè)計(jì)
- 寬表的設(shè)計(jì)
- 為什么要建設(shè)寬表
- 寬表的好處和不足
- 如何設(shè)計(jì)寬表
- 總結(jié)
寬表的設(shè)計(jì)
其實(shí)寬表是數(shù)倉里面非常重要的一塊,前面我們介紹過了維度表事實(shí)表,今天我們介紹一下寬表,前面我們說過了數(shù)倉是分層的,這是技術(shù)進(jìn)步和時(shí)代變化相結(jié)合的產(chǎn)物,數(shù)倉的分層式為了更好地管理數(shù)倉以及更加高效地進(jìn)行數(shù)據(jù)開發(fā)。
寬表主要出現(xiàn)在dwd 層和報(bào)表層,當(dāng)然有的人說dws 層也有,寬表,從字面意義上講就是字段比較多的數(shù)據(jù)庫表,通常情況下是將很多相關(guān)的數(shù)據(jù)包括維度表、實(shí)時(shí)、已有的指標(biāo)或者是dws/dwd 表關(guān)聯(lián)在一起形成的一張數(shù)據(jù)表。
由于把不同的內(nèi)容都放在同一張表存儲(chǔ),寬表已經(jīng)不符合范式設(shè)計(jì)的模型設(shè)計(jì)規(guī)范而且數(shù)倉里面也不強(qiáng)調(diào)范式設(shè)計(jì),隨之帶來的就是數(shù)據(jù)的大量冗余,與之相對(duì)應(yīng)的好處就是查詢性能的提高與便捷。
分層 請(qǐng)參考 數(shù)倉建模—分層建設(shè)理論
設(shè)計(jì) 請(qǐng)參考 數(shù)倉建模—建模方法論
為什么要建設(shè)寬表
就像我們前面說過分層的目的是為了管理方便、開發(fā)高效、問題定位、節(jié)約資源等等,那么我們建設(shè)寬表呢?前面學(xué)習(xí)建模方法論的時(shí)候,提到過維度模型的非強(qiáng)范式的,可以更好的利用大數(shù)據(jù)處理框架的處理能力,避免范式操作的過多關(guān)聯(lián)操作,可以實(shí)現(xiàn)高度的并行化。數(shù)據(jù)倉庫大多數(shù)時(shí)候是比較適合使用星型模型構(gòu)建底層數(shù)據(jù)Hive表,通過大量的冗余來提升查詢效率,星型模型對(duì)OLAP的分析引擎支持比較友好,這一點(diǎn)在Kylin中比較能體現(xiàn)。
可以更好的發(fā)揮大數(shù)據(jù)框架的能力
維度模型可以更好地利用大數(shù)據(jù)框架,體現(xiàn)在哪里的,體現(xiàn)在數(shù)據(jù)數(shù)據(jù)冗余,可以避免很多的關(guān)聯(lián),怎么體現(xiàn)的呢,寬表。但是這只是站在大數(shù)據(jù)框架層面上的理解,還有其他層面上的理解。
可以提高開發(fā)效率
一般情況下,我們的寬表包含了很多相關(guān)的數(shù)據(jù),如果我們?cè)趯挶淼幕A(chǔ)上做一些開發(fā),那就很方便,我們直接從寬表里面取數(shù)據(jù),避免了我們從頭計(jì)算,你設(shè)想一下你要是沒次都從ods開發(fā)一張報(bào)表,那是多痛苦的體驗(yàn)啊。
可以提高數(shù)據(jù)質(zhì)量
寬表的準(zhǔn)確性,一般都是經(jīng)歷了時(shí)間的檢驗(yàn)的,邏輯錯(cuò)誤的可能性很小,可以直接使用,要是讓你從頭開發(fā),那這個(gè)過程中可能因?yàn)閷?duì)業(yè)務(wù)理解不透徹或者是書寫的邏輯不正確,導(dǎo)致有數(shù)據(jù)質(zhì)量問題
可以統(tǒng)一指標(biāo)口徑
其實(shí)這一點(diǎn)和上面一點(diǎn)有點(diǎn)重復(fù),但是這兩點(diǎn)的強(qiáng)調(diào)的方面是不一樣的,因?yàn)槿绻覀兊膱?bào)表要是都能從我們的底層寬表出,那么我們報(bào)表上的指標(biāo)肯定是一樣的,其實(shí)這一點(diǎn)我相信很多人都深有體會(huì),同一個(gè)指標(biāo)的口徑不一致,導(dǎo)致我們提供的數(shù)據(jù)在不同的出口不一樣,是業(yè)務(wù)部門經(jīng)常提出的一個(gè)問題。其實(shí)這也就是我們一直強(qiáng)調(diào)的核心邏輯下沉的原因。
寬表的好處和不足
寬表的好處就是我們前面提到過的我們?yōu)槭裁匆ㄔO(shè)寬表的原因,接下來我們看一下寬表的不足
性能不高
因?yàn)槲覀兊膶挶淼挠?jì)算邏輯往往很復(fù)雜,再加上寬表的數(shù)據(jù)輸入是有大量依賴的,也就是說需要處理的數(shù)據(jù)量很大,在負(fù)載邏輯+大數(shù)據(jù)量的原因下,導(dǎo)致我們的寬表往往運(yùn)行很慢,資源占用很多,尤其是重跑的時(shí)候。
穩(wěn)定性不高
下面的最后一張表就是一張寬表,我們知道一個(gè)系統(tǒng)的穩(wěn)定性是取決于最差的一個(gè)環(huán)節(jié)的,這就是短板理論也叫木桶理論,我們的寬表的穩(wěn)定性也是很差的,這個(gè)主要是因?yàn)槲覀兊膶挶硪蕾囂?,每一個(gè)表的不穩(wěn)定性都會(huì)傳到到寬表。
假設(shè) 一張表依賴A B C 三張表,并且這三張表的穩(wěn)定性是 1/m 1/n 1/x,那么我們的寬表的穩(wěn)定性就是 1/m*n*x ,至于表的穩(wěn)定性你可用它成功運(yùn)行的次數(shù)/運(yùn)行的總次數(shù)
如果性能不高和穩(wěn)定性不高同時(shí)作用在一件事上的時(shí)候我們知道這其實(shí)是很致命的,例如你發(fā)現(xiàn)報(bào)表數(shù)據(jù)有問題,但是重跑需要幾個(gè)小時(shí),哈哈!
開發(fā)難度大/維護(hù)成本高
我們說了基于寬表做報(bào)表開發(fā)才是正確的姿勢(shì),但是寬表本身也是我們開發(fā)人員開發(fā)的,因?yàn)楸旧淼倪壿嫼軓?fù)雜設(shè)計(jì)的業(yè)務(wù)邏輯繁多,所以給我們的開發(fā)就帶來了挑戰(zhàn),而且由于業(yè)務(wù)邏輯的變更我們也需要去維護(hù)著復(fù)雜的邏輯,例如每次都讓你在幾千行的SQL 里面加邏輯。
如何設(shè)計(jì)寬表
寬表的好處和不足我們都講了,也就是說寬表雖好,但是帶來的問題也很多,下面我們就看一下如何從設(shè)計(jì)的角度來避免寬表的不足之處
寬表到底多寬
開始之前,我們思考一個(gè)問題,那就是寬表到底有多寬,就想我們前面講分層的時(shí)候說其實(shí)我們不分層也玩得轉(zhuǎn),早起的數(shù)倉就只有一層,現(xiàn)在我們考慮一個(gè)問題那就是寬表到底多寬才合適,其實(shí)你要把所有的數(shù)據(jù)裝進(jìn)去也可以。
所以我們要思考到底多寬才合適的,前面我們介紹過數(shù)據(jù)域的概念,我們與其回答多寬這個(gè)問題,不如回答寬表都應(yīng)該覆蓋哪些數(shù)據(jù),但是這個(gè)問題也不好回答,但是我們可以反著思考,寬表不應(yīng)該包含什么數(shù)據(jù),這個(gè)問題很好回答,寬表不應(yīng)該包含不屬于它所在域的數(shù)據(jù),例如會(huì)員域的寬表只應(yīng)該包含會(huì)員相關(guān)的信息,同理我們的寬表是針對(duì)某一個(gè)域而言的,也就是說它是有邊界的。
這下我們?cè)賮砘卮饘挶淼降锥鄬挘灰豢缬?,并且方便使用都是合理的。但是這似乎并不能解決我們上面提到的寬表的不足,只是指明了寬表的一個(gè)大致的方向。有了方向之后我們通過我們的設(shè)計(jì)策略就可以讓寬表瘦下來。
主次分類
主次分離,其實(shí)我們經(jīng)常聽到的一句話就是做事情要搞清楚主次,我們看一下表設(shè)計(jì)的主次是什么,假設(shè)我們做的是一個(gè)會(huì)員域的寬表,但是會(huì)員域是還是一個(gè)比較大的概念,所以我們還要發(fā)掘出我們這個(gè)表的主題,例如我們做的是一張會(huì)員域下的會(huì)員基本信息寬表,那么我們專注的肯定就是基本信息,例如會(huì)員信息打通。當(dāng)讓因?yàn)槭聦挶砟憧赡苓€會(huì)冗余的其他信息進(jìn)來,但是當(dāng)這樣的信息越來越多的時(shí)候,我們這張表的主題就越來越弱,所以我們就需要做拆分。
拆分可以讓我們更加聚焦表的主題,對(duì)于數(shù)倉開發(fā)人員而言可以更好的維護(hù)、對(duì)于使用方而言可以更加清楚的理解這張表的主題。
冷熱分離
除了前面的主次分離我們還可以做冷熱分離,其實(shí)冷熱分離這個(gè)詞我相信你不是第一次聽到,但是怎么看這個(gè)事情呢,你想一下你在數(shù)據(jù)存儲(chǔ)的時(shí)候是怎么做冷熱分離的,這里也是同樣的理念。
假設(shè)我有一張寬表,里面有200個(gè)字段,有30張報(bào)表在使用它,但是我發(fā)現(xiàn)前面150個(gè)經(jīng)常字段經(jīng)常被使用,后面 50個(gè)字段只有一兩張報(bào)表使用到了,那么我們就可以做一個(gè)冷熱分離,將寬表拆分。
穩(wěn)定與不穩(wěn)定分離
其實(shí)前面的主次分離、冷熱分離都可以提高穩(wěn)定性,但是前面我們不是為了穩(wěn)定性分離的。
我們經(jīng)常有這樣的寬表,它依賴埋點(diǎn)數(shù)據(jù),但是我們的埋點(diǎn)數(shù)據(jù)的特點(diǎn)就是量大,導(dǎo)致計(jì)算經(jīng)常延遲,那么我們的寬表就會(huì)受影響,從而我們的報(bào)表就受影響,但是很多時(shí)候你發(fā)現(xiàn)報(bào)表根本沒有用過埋點(diǎn)計(jì)算出來的指標(biāo),或者是只用了一兩個(gè)。那我們可以將其拆分,如果報(bào)表沒有使用到那就最好了,如果使用到了,那就后推,在報(bào)表層面上做關(guān)聯(lián),這樣我們的埋點(diǎn)數(shù)據(jù)即使出不來,我們的報(bào)表數(shù)據(jù)還是可以看的。
總結(jié)
主要講解了一下幾個(gè)方面
- 為什么要建設(shè)寬表
- 寬表的不足
- 如何設(shè)計(jì)寬表
- 寬表到底多寬
- 主次分離
- 冷熱分類
- 穩(wěn)定與不穩(wěn)定分類
設(shè)計(jì)寬表的理論其實(shí)說白了就是一句話高內(nèi)聚低耦合,當(dāng)然這幾個(gè)字你在其他領(lǐng)域可能很熟悉了,但是這里你就好好思考一下才能想通,我一直新信奉的是一力降十會(huì) 一拙破萬巧 也就是說你要學(xué)會(huì)根本的東西,才能舉一反三破萬難。