6000字詳解數據倉庫建設
時間:2021-08-19 15:18:11
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]01前言互聯(lián)網行業(yè),除了數據量大之外,業(yè)務時效性要求也很高,甚至很多是要求實時的。另外,互聯(lián)網行業(yè)的業(yè)務變化非???,不可能像傳統(tǒng)行業(yè)一樣,可以使用自頂向下的方法建立數據倉庫,一勞永逸,它要求新的業(yè)務很快能融入數據倉庫中來,老的下線的業(yè)務,能很方便的從現(xiàn)有的數據倉庫中下線。本文主要...
01 前言
互聯(lián)網行業(yè),除了數據量大之外,業(yè)務時效性要求也很高,甚至很多是要求實時的。另外,互聯(lián)網行業(yè)的業(yè)務變化非常快,不可能像傳統(tǒng)行業(yè)一樣,可以使用自頂向下的方法建立數據倉庫,一勞永逸,它要求新的業(yè)務很快能融入數據倉庫中來,老的下線的業(yè)務,能很方便的從現(xiàn)有的數據倉庫中下線。
本文主要從目前互聯(lián)網行業(yè)數據的采集,存儲,同步以及任務調度與監(jiān)控方面闡述了大數據數據倉庫建設的相關技術,還專門針對數據倉庫的維度建模技術做了詳細的介紹。
02 整體架構如下圖就是數據倉庫的邏輯分層架構:

1. 數據源
數據源,顧名思義就是數據的來源,互聯(lián)網公司的數據來源隨著公司的規(guī)模擴張而呈遞增趨勢,同時自不同的業(yè)務源,比如埋點采集,客戶上報等。
2. ODS層數據倉庫源頭系統(tǒng)的數據表通常會原封不動地存儲一份,這稱為ODS(Operation Data Store)層, ODS層也經常會被稱為準備區(qū)(Staging area),它們是后續(xù)數據倉庫層(即基于Kimball維度建模生成的事實表和維度表層,以及基于這些事實表和明細表加工的匯總層數據)加工數據的來源,同時ODS層也存儲著歷史的增量數據或全量數據。
3. DW層據倉庫明細層(Data Warehouse Detail , DWD)和數據倉庫匯總層(Data Warehouse Summary, DWS)是數據倉庫的主題內容。DWD和DWS層的數據是ODS層經過ETL清洗、轉換、加載生成的,而且它們通常都是基于Kimball的維度建模理論來構建的,并通過一致性維度和數據總線來保證各個子主題的維度一致性。
4. DWS層應用層匯總層主要是將DWD和DWS的明細數據在hadoop平臺進行匯總,然后將產生的結果同步到DWS數據庫,提供給各個應用。
03 數據采集數據采集的任務就是把數據從各種數據源中采集和存儲到數據存儲上,期間有可能會做一些簡單的清洗。
比較常見的就是用戶行為數據的采集。先做sdk埋點,通過kafka實時采集到用戶的訪問數據,再用spark做簡單的清洗,存入hdfs作為數據倉庫的數據源之一。
04 數據存儲隨著公司的規(guī)模不斷擴張,產生的數據也越來越到,像一些大公司每天產生的數據量都在PB級別,傳統(tǒng)的數據庫已經不能滿足存儲要求,目前hdfs是大數據環(huán)境下數據倉庫/數據平臺最完美的數據存儲解決方案。
在離線計算方面,也就是對實時性要求不高的部分,Hive還是首當其沖的選擇,豐富的數據類型、內置函數;壓縮比非常高的ORC/PARQUET文件存儲格式;非常方便的SQL支持,使得Hive在基于結構化數據上的統(tǒng)計分析遠遠比MapReduce要高效的多,一句SQL可以完成的需求,開發(fā)MR可能需要上百行代碼;而在實時計算方面,flink是最優(yōu)的選擇,不過目前僅支持java跟scala開發(fā)。
05 數據同步數據同步是指不同數據存儲系統(tǒng)之間要進行數據遷移,比如在hdfs上,大多業(yè)務和應用因為效率的原因不可以直接從HDFS上獲取數據,因此需要將hdfs上匯總后的數據同步至其他的存儲系統(tǒng),比如mysql。
Sqoop可以做到這一點,但是Sqoop太過繁重,而且不管數據量大小,都需要啟動MapReduce來執(zhí)行,而且需要Hadoop集群的每臺機器都能訪問業(yè)務數據庫。阿里開源的dataX是一個很好的解決方案。
06 維度建模維度建模(dimensional modeling)是專門用于分析型數據庫、數據倉庫、數據集市建模的方法。這里牽扯到兩個基本的名詞:維度,事實。
1、維度維度是維度建模的基礎和靈魂,在維度建模中,將度量成為事實,將環(huán)境描述為維度,維度是用于分析事實所需的多樣環(huán)境。
例如,在分析交易過程中,可以通過買家、賣家、商品和時間等維度描述交易發(fā)生的環(huán)境。
2、事實事實表作為數據倉庫維度建模的核心,緊緊圍繞著業(yè)務過程來設計,通過獲取描述業(yè)務過程的度量來表達業(yè)務過程,包含了引用的維度和與業(yè)務過程有關的度量。
事實表中一條記錄所表達的業(yè)務細節(jié)被稱之為粒度。通常粒度可以通過兩種方式來表述:一種是維度屬性組合所表示的細節(jié)程度;一種是所表示的具體業(yè)務含義。
維度建模涉及到的專業(yè)術語主要有以下幾個:
1、 數據域指面向業(yè)務分析,將業(yè)務過程活動維度進行抽象的集合。其中,業(yè)務過程可以概括為一個個不可分割的行為事件,在業(yè)務過程里可以定義指標;維度是指度量的環(huán)境,如買家下單事件,買件是維度。
為保障整個體系的生命力,數據域是需要抽象提煉并且長期維護更新的,但不輕易變動。在劃分數據域時,既要能涵蓋所有業(yè)務需求,又能在新業(yè)務進入時無影響的包含已有的數據還要擴展新的數據域。
2、 業(yè)務過程指企業(yè)活動事件,如下單、支付、退款都是業(yè)務過程。業(yè)務過程是一個不可分割的行為事件。
3、 時間周期用來明確數據統(tǒng)計的時間周期或者時間點,如自然月、最近30天,自然周等。
4、 修飾類型是對抽象詞的一種抽象劃分。修飾類型從屬某個數據域,如日志域的訪問終端涵蓋無線端,PC端等修飾詞。
5、 修飾詞指除了統(tǒng)計維度以外指標的業(yè)務場景限定抽象。修飾詞隸屬于某一個修飾類型。
6、 度量/原子指標基于某一業(yè)務事件行為下的度量,是業(yè)務定義中不可再分割的指標,具有明確的業(yè)務含義名詞,如支付金額。
7、維度上述已經做了介紹,不必重述。
8、 維度屬性維度屬性隸屬于某一個維度,如地理維度里面的國家名稱,國家id,省份名稱等。
9、 事實上述已經做了介紹,不必重述。
10、派生指標派生指標=一個原子指標 多個修飾詞 時間周期,可以理解為對原子指標業(yè)務統(tǒng)計范圍的圈定。
如原子指標:支付金額,最近一天海外買家支付金額為派生指標(最近一天為時間周期,海外為修飾詞,買家為維度)。
11、鉆取鉆取是改變維的層次,變換分析的粒度。它包括向上鉆?。╮oll up)和向下鉆取(drill down)。向上鉆取是在某一維上將低層次的細節(jié)數據概括到高層次的匯總數據,或者減少維數;是指自動生成匯總行的分析方法。通過向導的方式,用戶可以定義分析因素的匯總行,例如對于各地區(qū)各年度的銷售情況,可以生成地區(qū)與年度的合計行,也可以生成地區(qū)或者年度的合計行。
而向下鉆取則相反,它從匯總數據深入到細節(jié)數據進行觀察或增加新維。例如,用戶分析“各地區(qū)、城市的銷售情況”時,可以對某一個城市的銷售額細分為各個年度的銷售額,對某一年度的銷售額,可以繼續(xù)細分為各個季度的銷售額。通過鉆取的功能,使用戶對數據能更深入了解,更容易發(fā)現(xiàn)問題,做出正確的決策。
然后介紹下維度建模的三種模式,如下:
1、 星形模式星形模式(Star Schema)是最常用的維度建模方式,下圖展示了使用星形模式進行維度建模的關系結構:

可以看出,星形模式的維度建模由一個事實表和一組維表成,且具有以下特點:
2、雪花模式雪花模式(Snowflake Schema)是對星形模式的擴展,每個維表可繼續(xù)向外連接多個子維表。下圖為使用雪花模式進行維度建模的關系結構:

星形模式中的維表相對雪花模式來說要大,而且不滿足規(guī)范化設計。雪花模型相當于將星形模式的大維表拆分成小維表,滿足了規(guī)范化設計。然而這種模式在實際應用中很少見,因為這樣做會導致開發(fā)難度增大,而數據冗余問題在數據倉庫里并不嚴重。
3、星座模式星座模式(Fact Constellations Schema)也是星形模式的擴展?;谶@種思想就有了星座模式:

前面介紹的兩種維度建模方法都是多維表對應單事實表,但在很多時候維度空間內的事實表不止一個,而一個維表也可能被多個事實表用到。在業(yè)務發(fā)展后期,絕大部分維度建模都采用的是星座模式。
4、三種模式對比歸納一下,星形模式/雪花模式/星座模式的關系如下圖所示:

雪花模式是將星型模式的維表進一步劃分,使各維表均滿足規(guī)范化設計。而星座模式則是允許星形模式中出現(xiàn)多個事實表。
維度表設計維度的設計過程就是確定維度屬性的過程,如何生成維度屬性,以及所生成維度屬性的優(yōu)劣,決定了維度使用的方便性,成為數據倉庫易用性的關鍵。數據倉庫的能力直接與維度屬性的質量和深度成正比。
維度表基本設計方法下面以商品維度為例對維度設計放發(fā)進行詳細說明:
確定維度屬性的幾點提示:
如下圖是規(guī)范化的商品維度表現(xiàn)形式:

該模式屬于雪花模式。
注意:采用雪花模式,用戶在統(tǒng)計分析的過程中需要大量的關聯(lián)操作,使用復雜度高,同時查詢性能很差,如果數據量巨大,那就更差了;因此需要將維度的屬性層次合并到單個維度中,該操作稱之為反規(guī)范化,采用反規(guī)范化處理,方便,易用且性能好。
對于商品維度,如果采用反規(guī)范化,將表現(xiàn)為下圖所示的形式:
采用雪花模式,除了可以節(jié)約一部分存儲之外,對于OLAP系統(tǒng)來說沒有其他的效用。而現(xiàn)階段存儲的成本非常低。出于易用性和性能的考慮,維表一般設計成不規(guī)范化的。在實際應用中,幾乎總是使用維表的空間來換取簡明性和查詢性能。
緩慢變化維數據倉庫的特征之一就是反應歷史變化,所以如何處理維度的變化是設計的工作之一。緩慢變化維的提出是因為在現(xiàn)實世界中,維度的屬性不是靜態(tài)的,它會隨著時間的流逝緩慢的變化,與數據增長較快的事實表相比,維度變化相對緩慢。
以下介紹幾種處理這種情況的三種方式:
(1)第一種方式:重寫維度值。采用此種方式,不保留歷史數據(簡單來說就是更新相關的維度字段)。比如商品所屬類目與2019年5月20日由類目1變成類目2,采用第一種處理方式,變化記錄的前后如下圖所示:
變化前商品表和訂單表
變化后商品表和訂單表
(2)第二種方式:插入新的維度行。采用此種方式,保留歷史數據,維度值變化前后的事實和過去的維度關聯(lián),緯度值變化前后的事實和當前的維度值關聯(lián)。同上面的例子采用第二種方式,變化后的記錄如下圖所示:
(3)第三種方式:添加維度列。采用第二種方式不能將變化前后記錄的事實歸一為變化前的維度或者歸一為變化后的維度。比如根據業(yè)務需求,需要將5月份的交易金額全部統(tǒng)計到類目2上,采用第二種方式無法實現(xiàn)。針對此問題,采用第三種處理方式,保留歷史數據,可以使用任何一個屬性列。同上面的例子,采用第三種方式,變化前后的數據記錄如下:
變化前商品表和訂單表:
變化后的商品表和訂單表:
對于采用哪種方式解決緩慢變化維,只能根據業(yè)務需求去選擇。
事實表設計事實表作為數據倉庫維度建模的核心,緊緊圍繞著業(yè)務過程來設計,通過獲取描述業(yè)務過程的度量來表達業(yè)務過程,包含了引用的維度和業(yè)務過程有關的度量。相對維表來說,事實表要細長的多,行的增加速度也比維表快很多。事實表分為三種類型:事務事實表,周期快照事實表,累計快照事實表。
1、 事務事實表用來描述業(yè)務過程,跟蹤時間或者空間上某點的度量事件,保存的是最原子的數據,也成為“原子事實表”。
2、 周期快照事實表以具有規(guī)律的,可預見的時間間隔記錄事實如每天、每月、每年等。
3、 累計快照事實表用來表述開始和結束之間的關鍵步驟事件,覆蓋整個生命周期,通常具有多個時間字段來記錄關鍵時間點,當過程隨著時間變化時,記錄也會跟著修改。
本文主要討論事務事實表,以下介紹事實表的設計原則和設計方法:
事實表設計原則
事務事實表的基本設計方法
任何類型的事件都可以被理解成一種事務。比如交易過程中的創(chuàng)建訂單,買家付款,物流中的發(fā)貨,簽收,付款等。事務事實表針對這些過程創(chuàng)建的一種事實表。下面店鋪交易事務為例,闡述事務事實表的一般設計過程。
1、 選擇業(yè)務過程交易的過程分為:創(chuàng)建訂單、買家付款、賣家發(fā)貨、買家確認收貨,即下單、支付、發(fā)貨和成功完結四個業(yè)務過程。
Kimball維度建模理論認為,為了便于進行獨立的分析研究,應該為每一個業(yè)務過程建立一個事實表。
2、 確定粒度
業(yè)務過程選定之后,就要對每個業(yè)務過程確定一個粒度,即確定事實表每一行所表達的細節(jié)層次。需要為四個業(yè)務過程確定粒度,其中下單、支付和成功完結選擇交易子訂單粒度,即每個子訂單為事實表的一行,買家收貨的粒度為物流單。
3、 確定維度選定好業(yè)務過程并且確定粒度后,就可以確定維度信息了。在店鋪交易事實表設計過程中,按照經常用于統(tǒng)計分析的場景,確定維度包含:買家、賣家、商品、商品類目、發(fā)貨地區(qū)、收貨地址、父訂單維度以及雜項維度。
4、 確定事實作為過程度量的核心,事實表應該包含與其描述過程有關的所有事實。以店鋪交易事實表為例,選定三個業(yè)務過程:下單、支付、成功完結,不同的業(yè)務過程有不同的事實。比如在下單業(yè)務過程中,需要包含下單金額、下單數量、下單分攤金額;
經過以上四步店鋪交易事務事實表已成型,如下圖所示:

在確定維度時,包含了買賣家維度,商品維度,類目維度,收發(fā)貨等。Kimball維度建模理論建議在事實表中只保留這個維度表的外鍵,但是在實際的應用中,可以將店鋪名稱、商品類型、商品屬性、類目屬性冗余到事實表中,提高對事實表的過濾查詢,減少表之間的關聯(lián)次數,加快查詢速度,該操作稱之為退化維。
經過以上的操作,基本完成了店鋪交易事務事實表的設計工作。
07 元數據管理元數據通常定義為“描述數據的數據”,在數據倉庫中是定義和描述DW/BI系統(tǒng)的結構,操作和內容的所有信息。元數據貫穿了數據倉庫的整個生命周期,使用元數據驅動數據倉庫的開發(fā),使數據倉庫自動化,可視化。按照不同的用途將元數據分為兩類:技術元數據和業(yè)務元數據。
技術元數據指描述系統(tǒng)中技術細節(jié)相關的概念、關系和規(guī)則的數據,包括對數據結構、數據處理方面的描述,以及數據倉庫、ETL、前端展現(xiàn)等技術細節(jié)方面的信息。常見的技術元數據有:
業(yè)務元數據指從業(yè)務角度描述業(yè)務領域相關的概念、關系和規(guī)則的數據,包括業(yè)務術語和業(yè)務規(guī)則等信息。常用的技術元數據有:
如維度和屬性、業(yè)務過程、指標等規(guī)范化定義,用于更好的管理和使用數據。數據應用元數據,數據報表、數據產品等配置和運行元數據。
08 任務調度與監(jiān)控在數據倉庫建設中,有各種各樣非常多的程序和任務,比如:數據采集任務、數據同步任務、數據清洗任務、數據分析任務等。這些任務除了定時調度,還存在非常復雜的任務依賴關系。
比如:數據分析任務必須等相應的數據采集任務完成后才能開始;數據同步任務需要等數據分析任務完成后才能開始;這就需要一個非常完善的任務調度與監(jiān)控系統(tǒng),它作為數據倉庫的中樞,負責調度和監(jiān)控所有任務的分配與運行。
目前有能力的公司都是自己開發(fā)調度工具,如中國平安(linkdu),銀行行業(yè)用的較多是Control-M,一些互聯(lián)網公司可能會選擇airflow作為自己的調度工具。具體采用哪種工具,請根據自己公司的本身現(xiàn)狀去做定奪。
09 總結數據倉庫建設是一個綜合性技術,而且當企業(yè)業(yè)務復雜的時候,這部分工作更是需要專門團隊與業(yè)務方共同合作來完成。因此一個優(yōu)秀的數據倉庫建模團隊既要有堅實的數據倉庫建模技術,還要有對現(xiàn)實業(yè)務清晰、透徹的理解。另外,架構并不是技術越多越新越好,而是在可以滿足需求的情況下,越簡單越穩(wěn)定越好。
互聯(lián)網行業(yè),除了數據量大之外,業(yè)務時效性要求也很高,甚至很多是要求實時的。另外,互聯(lián)網行業(yè)的業(yè)務變化非常快,不可能像傳統(tǒng)行業(yè)一樣,可以使用自頂向下的方法建立數據倉庫,一勞永逸,它要求新的業(yè)務很快能融入數據倉庫中來,老的下線的業(yè)務,能很方便的從現(xiàn)有的數據倉庫中下線。
本文主要從目前互聯(lián)網行業(yè)數據的采集,存儲,同步以及任務調度與監(jiān)控方面闡述了大數據數據倉庫建設的相關技術,還專門針對數據倉庫的維度建模技術做了詳細的介紹。
02 整體架構如下圖就是數據倉庫的邏輯分層架構:

1. 數據源
數據源,顧名思義就是數據的來源,互聯(lián)網公司的數據來源隨著公司的規(guī)模擴張而呈遞增趨勢,同時自不同的業(yè)務源,比如埋點采集,客戶上報等。
2. ODS層數據倉庫源頭系統(tǒng)的數據表通常會原封不動地存儲一份,這稱為ODS(Operation Data Store)層, ODS層也經常會被稱為準備區(qū)(Staging area),它們是后續(xù)數據倉庫層(即基于Kimball維度建模生成的事實表和維度表層,以及基于這些事實表和明細表加工的匯總層數據)加工數據的來源,同時ODS層也存儲著歷史的增量數據或全量數據。
3. DW層據倉庫明細層(Data Warehouse Detail , DWD)和數據倉庫匯總層(Data Warehouse Summary, DWS)是數據倉庫的主題內容。DWD和DWS層的數據是ODS層經過ETL清洗、轉換、加載生成的,而且它們通常都是基于Kimball的維度建模理論來構建的,并通過一致性維度和數據總線來保證各個子主題的維度一致性。
4. DWS層應用層匯總層主要是將DWD和DWS的明細數據在hadoop平臺進行匯總,然后將產生的結果同步到DWS數據庫,提供給各個應用。
03 數據采集數據采集的任務就是把數據從各種數據源中采集和存儲到數據存儲上,期間有可能會做一些簡單的清洗。
比較常見的就是用戶行為數據的采集。先做sdk埋點,通過kafka實時采集到用戶的訪問數據,再用spark做簡單的清洗,存入hdfs作為數據倉庫的數據源之一。
04 數據存儲隨著公司的規(guī)模不斷擴張,產生的數據也越來越到,像一些大公司每天產生的數據量都在PB級別,傳統(tǒng)的數據庫已經不能滿足存儲要求,目前hdfs是大數據環(huán)境下數據倉庫/數據平臺最完美的數據存儲解決方案。
在離線計算方面,也就是對實時性要求不高的部分,Hive還是首當其沖的選擇,豐富的數據類型、內置函數;壓縮比非常高的ORC/PARQUET文件存儲格式;非常方便的SQL支持,使得Hive在基于結構化數據上的統(tǒng)計分析遠遠比MapReduce要高效的多,一句SQL可以完成的需求,開發(fā)MR可能需要上百行代碼;而在實時計算方面,flink是最優(yōu)的選擇,不過目前僅支持java跟scala開發(fā)。
05 數據同步數據同步是指不同數據存儲系統(tǒng)之間要進行數據遷移,比如在hdfs上,大多業(yè)務和應用因為效率的原因不可以直接從HDFS上獲取數據,因此需要將hdfs上匯總后的數據同步至其他的存儲系統(tǒng),比如mysql。
Sqoop可以做到這一點,但是Sqoop太過繁重,而且不管數據量大小,都需要啟動MapReduce來執(zhí)行,而且需要Hadoop集群的每臺機器都能訪問業(yè)務數據庫。阿里開源的dataX是一個很好的解決方案。
06 維度建模維度建模(dimensional modeling)是專門用于分析型數據庫、數據倉庫、數據集市建模的方法。這里牽扯到兩個基本的名詞:維度,事實。
1、維度維度是維度建模的基礎和靈魂,在維度建模中,將度量成為事實,將環(huán)境描述為維度,維度是用于分析事實所需的多樣環(huán)境。
例如,在分析交易過程中,可以通過買家、賣家、商品和時間等維度描述交易發(fā)生的環(huán)境。
2、事實事實表作為數據倉庫維度建模的核心,緊緊圍繞著業(yè)務過程來設計,通過獲取描述業(yè)務過程的度量來表達業(yè)務過程,包含了引用的維度和與業(yè)務過程有關的度量。
事實表中一條記錄所表達的業(yè)務細節(jié)被稱之為粒度。通常粒度可以通過兩種方式來表述:一種是維度屬性組合所表示的細節(jié)程度;一種是所表示的具體業(yè)務含義。
維度建模涉及到的專業(yè)術語主要有以下幾個:
1、 數據域指面向業(yè)務分析,將業(yè)務過程活動維度進行抽象的集合。其中,業(yè)務過程可以概括為一個個不可分割的行為事件,在業(yè)務過程里可以定義指標;維度是指度量的環(huán)境,如買家下單事件,買件是維度。
為保障整個體系的生命力,數據域是需要抽象提煉并且長期維護更新的,但不輕易變動。在劃分數據域時,既要能涵蓋所有業(yè)務需求,又能在新業(yè)務進入時無影響的包含已有的數據還要擴展新的數據域。
2、 業(yè)務過程指企業(yè)活動事件,如下單、支付、退款都是業(yè)務過程。業(yè)務過程是一個不可分割的行為事件。
3、 時間周期用來明確數據統(tǒng)計的時間周期或者時間點,如自然月、最近30天,自然周等。
4、 修飾類型是對抽象詞的一種抽象劃分。修飾類型從屬某個數據域,如日志域的訪問終端涵蓋無線端,PC端等修飾詞。
5、 修飾詞指除了統(tǒng)計維度以外指標的業(yè)務場景限定抽象。修飾詞隸屬于某一個修飾類型。
6、 度量/原子指標基于某一業(yè)務事件行為下的度量,是業(yè)務定義中不可再分割的指標,具有明確的業(yè)務含義名詞,如支付金額。
7、維度上述已經做了介紹,不必重述。
8、 維度屬性維度屬性隸屬于某一個維度,如地理維度里面的國家名稱,國家id,省份名稱等。
9、 事實上述已經做了介紹,不必重述。
10、派生指標派生指標=一個原子指標 多個修飾詞 時間周期,可以理解為對原子指標業(yè)務統(tǒng)計范圍的圈定。
如原子指標:支付金額,最近一天海外買家支付金額為派生指標(最近一天為時間周期,海外為修飾詞,買家為維度)。
11、鉆取鉆取是改變維的層次,變換分析的粒度。它包括向上鉆?。╮oll up)和向下鉆取(drill down)。向上鉆取是在某一維上將低層次的細節(jié)數據概括到高層次的匯總數據,或者減少維數;是指自動生成匯總行的分析方法。通過向導的方式,用戶可以定義分析因素的匯總行,例如對于各地區(qū)各年度的銷售情況,可以生成地區(qū)與年度的合計行,也可以生成地區(qū)或者年度的合計行。
而向下鉆取則相反,它從匯總數據深入到細節(jié)數據進行觀察或增加新維。例如,用戶分析“各地區(qū)、城市的銷售情況”時,可以對某一個城市的銷售額細分為各個年度的銷售額,對某一年度的銷售額,可以繼續(xù)細分為各個季度的銷售額。通過鉆取的功能,使用戶對數據能更深入了解,更容易發(fā)現(xiàn)問題,做出正確的決策。
然后介紹下維度建模的三種模式,如下:
1、 星形模式星形模式(Star Schema)是最常用的維度建模方式,下圖展示了使用星形模式進行維度建模的關系結構:

可以看出,星形模式的維度建模由一個事實表和一組維表成,且具有以下特點:
- a. 維表只和事實表關聯(lián),維表之間沒有關聯(lián)
- b. 每個維表的主碼為單列,且該主碼放置在事實表中,作為兩邊連接的外碼
- c. 以事實表為核心,維表圍繞核心呈星形分布
2、雪花模式雪花模式(Snowflake Schema)是對星形模式的擴展,每個維表可繼續(xù)向外連接多個子維表。下圖為使用雪花模式進行維度建模的關系結構:

星形模式中的維表相對雪花模式來說要大,而且不滿足規(guī)范化設計。雪花模型相當于將星形模式的大維表拆分成小維表,滿足了規(guī)范化設計。然而這種模式在實際應用中很少見,因為這樣做會導致開發(fā)難度增大,而數據冗余問題在數據倉庫里并不嚴重。
3、星座模式星座模式(Fact Constellations Schema)也是星形模式的擴展?;谶@種思想就有了星座模式:

前面介紹的兩種維度建模方法都是多維表對應單事實表,但在很多時候維度空間內的事實表不止一個,而一個維表也可能被多個事實表用到。在業(yè)務發(fā)展后期,絕大部分維度建模都采用的是星座模式。
4、三種模式對比歸納一下,星形模式/雪花模式/星座模式的關系如下圖所示:

雪花模式是將星型模式的維表進一步劃分,使各維表均滿足規(guī)范化設計。而星座模式則是允許星形模式中出現(xiàn)多個事實表。
維度表設計維度的設計過程就是確定維度屬性的過程,如何生成維度屬性,以及所生成維度屬性的優(yōu)劣,決定了維度使用的方便性,成為數據倉庫易用性的關鍵。數據倉庫的能力直接與維度屬性的質量和深度成正比。
維度表基本設計方法下面以商品維度為例對維度設計放發(fā)進行詳細說明:
- 第一步:選擇維度或者新建維度。作為維度建模的核心,在企業(yè)級數據倉庫中,必須保證維度的唯一性。以商品維度為例,有且只有一個維度定義。
- 第二步:確定主維表。此處的主維表一般是ODS表,直接與業(yè)務系統(tǒng)同步。
- 第三步:確定相關維表。數據倉庫是業(yè)務源系統(tǒng)的數據整合,不同業(yè)務系統(tǒng)或者同一業(yè)務系統(tǒng)中的表之間存在關聯(lián)性,根據業(yè)務系統(tǒng)的梳理,確定哪些表和主維表存在關聯(lián)關系,并選擇其中的某些表用于生成維度屬性。以商品維度為例,根據業(yè)務邏輯的梳理,可以得到商品與類目、sku、買家、賣家、店鋪等維度存在的關聯(lián)關系。
- 第四步:確定維度屬性。本步驟主要包括兩個階段,其中一個階段是從主維表中選擇維度屬性或生成新的維度屬性;第二個階段是從相關維表中選擇維度屬性或者生成新的維度屬性。以商品維度為例,從主維表和類目、sku、賣家、店鋪等相關維表中選擇維度屬性或者生成新的維度屬性。
確定維度屬性的幾點提示:
- a、 盡可能生成豐富的維度屬性
- b、 盡可能多的給出包括一些富有意義的文字描述
- c、 區(qū)分數值型屬性和事實
- d、 盡可能沉淀出通用的維度屬性
如下圖是規(guī)范化的商品維度表現(xiàn)形式:

該模式屬于雪花模式。
注意:采用雪花模式,用戶在統(tǒng)計分析的過程中需要大量的關聯(lián)操作,使用復雜度高,同時查詢性能很差,如果數據量巨大,那就更差了;因此需要將維度的屬性層次合并到單個維度中,該操作稱之為反規(guī)范化,采用反規(guī)范化處理,方便,易用且性能好。
對于商品維度,如果采用反規(guī)范化,將表現(xiàn)為下圖所示的形式:

緩慢變化維數據倉庫的特征之一就是反應歷史變化,所以如何處理維度的變化是設計的工作之一。緩慢變化維的提出是因為在現(xiàn)實世界中,維度的屬性不是靜態(tài)的,它會隨著時間的流逝緩慢的變化,與數據增長較快的事實表相比,維度變化相對緩慢。
以下介紹幾種處理這種情況的三種方式:
(1)第一種方式:重寫維度值。采用此種方式,不保留歷史數據(簡單來說就是更新相關的維度字段)。比如商品所屬類目與2019年5月20日由類目1變成類目2,采用第一種處理方式,變化記錄的前后如下圖所示:
變化前商品表和訂單表


(2)第二種方式:插入新的維度行。采用此種方式,保留歷史數據,維度值變化前后的事實和過去的維度關聯(lián),緯度值變化前后的事實和當前的維度值關聯(lián)。同上面的例子采用第二種方式,變化后的記錄如下圖所示:

(3)第三種方式:添加維度列。采用第二種方式不能將變化前后記錄的事實歸一為變化前的維度或者歸一為變化后的維度。比如根據業(yè)務需求,需要將5月份的交易金額全部統(tǒng)計到類目2上,采用第二種方式無法實現(xiàn)。針對此問題,采用第三種處理方式,保留歷史數據,可以使用任何一個屬性列。同上面的例子,采用第三種方式,變化前后的數據記錄如下:
變化前商品表和訂單表:


事實表設計事實表作為數據倉庫維度建模的核心,緊緊圍繞著業(yè)務過程來設計,通過獲取描述業(yè)務過程的度量來表達業(yè)務過程,包含了引用的維度和業(yè)務過程有關的度量。相對維表來說,事實表要細長的多,行的增加速度也比維表快很多。事實表分為三種類型:事務事實表,周期快照事實表,累計快照事實表。
1、 事務事實表用來描述業(yè)務過程,跟蹤時間或者空間上某點的度量事件,保存的是最原子的數據,也成為“原子事實表”。
2、 周期快照事實表以具有規(guī)律的,可預見的時間間隔記錄事實如每天、每月、每年等。
3、 累計快照事實表用來表述開始和結束之間的關鍵步驟事件,覆蓋整個生命周期,通常具有多個時間字段來記錄關鍵時間點,當過程隨著時間變化時,記錄也會跟著修改。
本文主要討論事務事實表,以下介紹事實表的設計原則和設計方法:
事實表設計原則
- a、 盡可能包括所有業(yè)務過程相關的事實
- b、 只選擇與業(yè)務過程相關的事實
- c、 分解不可加事實為可加的組件
- d、 選擇維度和事實之前必須先聲明粒度
- e、 在同一個事實表中不可以有多重不同粒度的事實
- f、 事實的單位要保持一致
- g、 對事實的null值要處理
- h、 使用退化維提高事實表的易用性
事務事實表的基本設計方法
任何類型的事件都可以被理解成一種事務。比如交易過程中的創(chuàng)建訂單,買家付款,物流中的發(fā)貨,簽收,付款等。事務事實表針對這些過程創(chuàng)建的一種事實表。下面店鋪交易事務為例,闡述事務事實表的一般設計過程。
1、 選擇業(yè)務過程交易的過程分為:創(chuàng)建訂單、買家付款、賣家發(fā)貨、買家確認收貨,即下單、支付、發(fā)貨和成功完結四個業(yè)務過程。
Kimball維度建模理論認為,為了便于進行獨立的分析研究,應該為每一個業(yè)務過程建立一個事實表。
2、 確定粒度
業(yè)務過程選定之后,就要對每個業(yè)務過程確定一個粒度,即確定事實表每一行所表達的細節(jié)層次。需要為四個業(yè)務過程確定粒度,其中下單、支付和成功完結選擇交易子訂單粒度,即每個子訂單為事實表的一行,買家收貨的粒度為物流單。
3、 確定維度選定好業(yè)務過程并且確定粒度后,就可以確定維度信息了。在店鋪交易事實表設計過程中,按照經常用于統(tǒng)計分析的場景,確定維度包含:買家、賣家、商品、商品類目、發(fā)貨地區(qū)、收貨地址、父訂單維度以及雜項維度。
4、 確定事實作為過程度量的核心,事實表應該包含與其描述過程有關的所有事實。以店鋪交易事實表為例,選定三個業(yè)務過程:下單、支付、成功完結,不同的業(yè)務過程有不同的事實。比如在下單業(yè)務過程中,需要包含下單金額、下單數量、下單分攤金額;
經過以上四步店鋪交易事務事實表已成型,如下圖所示:

在確定維度時,包含了買賣家維度,商品維度,類目維度,收發(fā)貨等。Kimball維度建模理論建議在事實表中只保留這個維度表的外鍵,但是在實際的應用中,可以將店鋪名稱、商品類型、商品屬性、類目屬性冗余到事實表中,提高對事實表的過濾查詢,減少表之間的關聯(lián)次數,加快查詢速度,該操作稱之為退化維。
經過以上的操作,基本完成了店鋪交易事務事實表的設計工作。
07 元數據管理元數據通常定義為“描述數據的數據”,在數據倉庫中是定義和描述DW/BI系統(tǒng)的結構,操作和內容的所有信息。元數據貫穿了數據倉庫的整個生命周期,使用元數據驅動數據倉庫的開發(fā),使數據倉庫自動化,可視化。按照不同的用途將元數據分為兩類:技術元數據和業(yè)務元數據。
技術元數據指描述系統(tǒng)中技術細節(jié)相關的概念、關系和規(guī)則的數據,包括對數據結構、數據處理方面的描述,以及數據倉庫、ETL、前端展現(xiàn)等技術細節(jié)方面的信息。常見的技術元數據有:
- 1、分布式計算存儲元數據,如表、列、分區(qū)等信息。記錄表的表名、分區(qū)信息、責任人信息、文件大小、表類型、生命周期、列的字段、字段類型、字段備注等。
- 2、分布式計算系統(tǒng)運行元數據,集群上所有任務的運行信息;類似hive的運行日志,包括作業(yè)類型、實例名稱、輸入輸出、運行參數、運行時間等。
- 3、調度任務中的調度信息,包括輸入輸出字段、依賴類型、依賴關系等。
- 4、數據質量跟運維相關元數據,如任務監(jiān)控、運維報警、數據質量、故障等。
業(yè)務元數據指從業(yè)務角度描述業(yè)務領域相關的概念、關系和規(guī)則的數據,包括業(yè)務術語和業(yè)務規(guī)則等信息。常用的技術元數據有:
如維度和屬性、業(yè)務過程、指標等規(guī)范化定義,用于更好的管理和使用數據。數據應用元數據,數據報表、數據產品等配置和運行元數據。
08 任務調度與監(jiān)控在數據倉庫建設中,有各種各樣非常多的程序和任務,比如:數據采集任務、數據同步任務、數據清洗任務、數據分析任務等。這些任務除了定時調度,還存在非常復雜的任務依賴關系。
比如:數據分析任務必須等相應的數據采集任務完成后才能開始;數據同步任務需要等數據分析任務完成后才能開始;這就需要一個非常完善的任務調度與監(jiān)控系統(tǒng),它作為數據倉庫的中樞,負責調度和監(jiān)控所有任務的分配與運行。
目前有能力的公司都是自己開發(fā)調度工具,如中國平安(linkdu),銀行行業(yè)用的較多是Control-M,一些互聯(lián)網公司可能會選擇airflow作為自己的調度工具。具體采用哪種工具,請根據自己公司的本身現(xiàn)狀去做定奪。
09 總結數據倉庫建設是一個綜合性技術,而且當企業(yè)業(yè)務復雜的時候,這部分工作更是需要專門團隊與業(yè)務方共同合作來完成。因此一個優(yōu)秀的數據倉庫建模團隊既要有堅實的數據倉庫建模技術,還要有對現(xiàn)實業(yè)務清晰、透徹的理解。另外,架構并不是技術越多越新越好,而是在可以滿足需求的情況下,越簡單越穩(wěn)定越好。