手把手教你數(shù)據(jù)倉庫建設(shè)
本文轉(zhuǎn)載自微信公眾號(hào)「數(shù)倉寶貝庫」,作者范鋼 孫玄 。轉(zhuǎn)載本文請(qǐng)聯(lián)系數(shù)倉寶貝庫公眾號(hào)。
前面部分是對(duì)數(shù)據(jù)的采集,然后經(jīng)過ETL過程,最終存入數(shù)據(jù)倉庫。這部分是通過一切手段收集數(shù)據(jù),然而它的建設(shè)與數(shù)據(jù)應(yīng)用需求無關(guān)。因?yàn)閿?shù)據(jù)倉庫存儲(chǔ)的是過去數(shù)年的數(shù)據(jù),而數(shù)據(jù)應(yīng)用需求總是在變。如果數(shù)據(jù)應(yīng)用需求一變化,就需要修改數(shù)據(jù)倉庫的表結(jié)構(gòu),那么這數(shù)年的數(shù)據(jù)都必須要重新計(jì)算,系統(tǒng)就會(huì)始終處于一種十分不穩(wěn)定的狀態(tài),維護(hù)成本極高。所以,只有數(shù)據(jù)倉庫的建設(shè)與數(shù)據(jù)應(yīng)用需求無關(guān),才能保證需求變更對(duì)數(shù)據(jù)倉庫沒有影響,才能讓系統(tǒng)穩(wěn)定運(yùn)行。
后面部分是根據(jù)不同的數(shù)據(jù)分析需求,從數(shù)據(jù)倉庫中獲取數(shù)據(jù),完成各自的數(shù)據(jù)分析,將最終的分析結(jié)果寫入數(shù)據(jù)集市。數(shù)據(jù)集市的建設(shè)是與各自的數(shù)據(jù)分析的需求息息相關(guān)的,每次需求變更時(shí),變更的是各自的數(shù)據(jù)集市,而不是數(shù)據(jù)倉庫。
01多維數(shù)據(jù)建模
經(jīng)過前面一系列的ETL過程(什么是ETL?一文掌握ETL設(shè)計(jì)過程),我們最終將數(shù)據(jù)裝載到數(shù)據(jù)倉庫中。數(shù)據(jù)倉庫是按照多維數(shù)據(jù)模型的思路進(jìn)行建設(shè)的。在多維數(shù)據(jù)模型中,動(dòng)態(tài)數(shù)據(jù)就轉(zhuǎn)化為了事實(shí)表,靜態(tài)數(shù)據(jù)就轉(zhuǎn)化為了維度表。進(jìn)項(xiàng)發(fā)票事實(shí)表、銷項(xiàng)發(fā)票事實(shí)表都是事實(shí)表,但從其中關(guān)聯(lián)出來了日期維度表、納稅人維度表、稅務(wù)機(jī)關(guān)維度表、地域維度表與行業(yè)維度表。
多維數(shù)據(jù)模型的設(shè)計(jì)有兩種思路:雪花模型與星形模型,如下圖所示。
雪花模型與星形模型
左圖是雪花模型的設(shè)計(jì),它最大的特點(diǎn)是在維度表上還要關(guān)聯(lián)維度表,如在納稅人維度表的基礎(chǔ)上還要關(guān)聯(lián)行業(yè)維度表。這樣設(shè)計(jì)比較容易理解,但會(huì)造成頻繁的join操作,在海量數(shù)據(jù)中降低查詢性能。譬如,要對(duì)進(jìn)項(xiàng)發(fā)票進(jìn)行地域的統(tǒng)計(jì),就需要將進(jìn)項(xiàng)發(fā)票事實(shí)表與納稅人維度表相關(guān)聯(lián),再關(guān)聯(lián)稅務(wù)機(jī)關(guān)維度表、地域維度表,才能完成,這極大影響了系統(tǒng)性能。因此,為了提升查詢性能,基于空間換時(shí)間的思想,我們又提出了星形模型。
右圖是星形模型的設(shè)計(jì),它最大的特點(diǎn)是不會(huì)再有維度與維度的關(guān)聯(lián),而是所有維度表都只與事實(shí)表關(guān)聯(lián)。譬如對(duì)進(jìn)項(xiàng)發(fā)票進(jìn)行地域分析,只需要進(jìn)項(xiàng)發(fā)票事實(shí)表關(guān)聯(lián)地域維度表就可以了,在海量數(shù)據(jù)中的性能將得到極大的提升。
接著,在以上事實(shí)表的基礎(chǔ)上,還可以從不同的維度與粒度對(duì)數(shù)據(jù)進(jìn)行匯總,形成聚合表。譬如,對(duì)進(jìn)項(xiàng)發(fā)票事實(shí)表按照行業(yè)進(jìn)行匯總,或者按照地域進(jìn)行匯總,形成“進(jìn)項(xiàng)發(fā)票行業(yè)聚合表”與“進(jìn)項(xiàng)發(fā)票地域聚合表”,等等。
以上的分析都是在“開票主題域”中進(jìn)行的,但是按照業(yè)務(wù)流程,還有“申報(bào)主題域”“征收主題域”“稽查主題域”等,如下圖所示。這樣,數(shù)據(jù)中臺(tái)就按照業(yè)務(wù)模塊劃分為了多個(gè)主題域,然后在各個(gè)主題域進(jìn)行多維建模,形成數(shù)據(jù)倉庫。但各個(gè)主題域可以擁有共同的維度表,如納稅人維度表、稅務(wù)機(jī)關(guān)維度表等。
主題域模型
02數(shù)據(jù)中臺(tái)的分層
數(shù)據(jù)中臺(tái)的建設(shè),除了按照主題域進(jìn)行縱向劃分,還要通過分層進(jìn)行橫向劃分。數(shù)據(jù)中臺(tái)通過分層,劃分為原始數(shù)據(jù)層(STAGE)、細(xì)節(jié)數(shù)據(jù)層(ODS/DWD)、輕度綜合層(MID/DWS)與數(shù)據(jù)集市層(DM),如下圖所示。每一層的數(shù)據(jù)都存儲(chǔ)在Hive數(shù)據(jù)庫中,然后通過Schema劃分出不同的層次。
數(shù)據(jù)中臺(tái)的系統(tǒng)分層
最底層是原始數(shù)據(jù)層(STAGE)。所有的原始數(shù)據(jù)都在這里,通過Schema進(jìn)行劃分,來自哪個(gè)數(shù)據(jù)來源就存儲(chǔ)在哪個(gè)Schema中,并且表名與原始庫的表名一致。
接著是細(xì)節(jié)數(shù)據(jù)層(ODS/DWD),它是經(jīng)過ETL過程以后導(dǎo)入數(shù)據(jù)倉庫的事實(shí)表與維度表。ETL過程的中間臨時(shí)表存入名為etl的Schema,數(shù)據(jù)倉庫的事實(shí)表與維度表存入名為dw的Schema。同時(shí),制訂命名規(guī)范,事實(shí)表以dw_fact_xxx命名,如訂單事實(shí)表dw_fact_order,維度表以dw_dim_xxx命名,如日期維度表dw_dim_date。
緊接著是輕度綜合層(MID/DWS),它是在事實(shí)表的基礎(chǔ)上按照不同維度與粒度形成的聚合表。聚合表以dw_agg_xxx命名,如進(jìn)項(xiàng)發(fā)票按納稅人聚合表dw_agg_jxfp_nsr、進(jìn)項(xiàng)發(fā)票按稅務(wù)機(jī)關(guān)聚合表dw_agg_jxfp_swjg等。
最后,是在數(shù)據(jù)倉庫之上的數(shù)據(jù)集市層(DM),它通過抽取前兩層中的事實(shí)表與聚合表的數(shù)據(jù),按照不同的用戶需求進(jìn)行數(shù)據(jù)分析,最后形成數(shù)據(jù)結(jié)果。數(shù)據(jù)集市既包括最終結(jié)果表,也包括中間結(jié)果表。數(shù)據(jù)集市以dw_dm_xxx命名,如“購車人未繳納車輛購置稅預(yù)警”屬于“機(jī)動(dòng)車消費(fèi)稅”分析模塊,它需要計(jì)算出應(yīng)免稅數(shù)據(jù)dw_dm_jdcxfs_ms,然后計(jì)算出未繳稅數(shù)據(jù)dw_dm_jdcxfs_wjs。大多數(shù)常規(guī)數(shù)據(jù)分析就是這樣通過SparkSQL進(jìn)行的。
本書摘編自《架構(gòu)真意:企業(yè)級(jí)應(yīng)用架構(gòu)設(shè)計(jì)方法論與實(shí)踐》,經(jīng)出版方授權(quán)發(fā)布。