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