一、數(shù)據(jù)模型架構(gòu)規(guī)范
?
?
-
ODS:Operational Data Store,操作數(shù)據(jù)層,在結(jié)構(gòu)上其與源系統(tǒng)的增量或者全量數(shù)據(jù)基本保持一致。它相當(dāng)于DW數(shù)據(jù)的一個(gè)數(shù)據(jù)準(zhǔn)備區(qū),同時(shí)又承擔(dān)著基礎(chǔ)數(shù)據(jù)的記錄以及歷史變化。其主要作用是把基礎(chǔ)數(shù)據(jù)引入到DMP。
?
-
CDM:Common Data Model,公共維度模型層,又細(xì)分為DWD和DWS。它的主要作用是完成數(shù)據(jù)加工與整合,建立一致性的維度,構(gòu)建可復(fù)用的面向分析和統(tǒng)計(jì)的明細(xì)事實(shí)表,以及匯總公共粒度的指標(biāo)。
-
DWD:Data Warehouse Detail,明細(xì)數(shù)據(jù)層。
-
DWS:Data Warehouse Summary,匯總數(shù)據(jù)層。
?
-
ADS:Application Data Service,應(yīng)用數(shù)據(jù)層。
?
?
請(qǐng)根據(jù)業(yè)務(wù)劃分?jǐn)?shù)據(jù)并約定命名,建議針對(duì)業(yè)務(wù)名稱(chēng)結(jié)合數(shù)據(jù)層次約定相關(guān)命名的英文縮寫(xiě),這樣可以給后續(xù)數(shù)據(jù)開(kāi)發(fā)過(guò)程中,對(duì)項(xiàng)目空間、表、字段等命名作為重要參照。
?
-
按業(yè)務(wù)劃分:命名時(shí)按主要的業(yè)務(wù)劃分,以指導(dǎo)物理模型的劃分原則、命名原則及使用的ODS project。
-
按數(shù)據(jù)域劃分:命名時(shí)按照CDM層的數(shù)據(jù)進(jìn)行數(shù)據(jù)域劃分,以便有效地對(duì)數(shù)據(jù)進(jìn)行管理,以及指導(dǎo)數(shù)據(jù)表的命名。例如,"用戶"數(shù)據(jù)的英文可定義為'user'。
-
按業(yè)務(wù)過(guò)程劃分:當(dāng)一個(gè)數(shù)據(jù)域由多個(gè)業(yè)務(wù)過(guò)程組成時(shí),命名時(shí)可以按業(yè)務(wù)流程劃分。業(yè)務(wù)過(guò)程是從數(shù)據(jù)分析角度看客觀存在的或者抽象的業(yè)務(wù)行為動(dòng)作。例如,用戶行為數(shù)據(jù)域中的"登錄"這個(gè)業(yè)務(wù)過(guò)程的英文縮寫(xiě)可約定命名為'user_login'。
?
?
模型是對(duì)現(xiàn)實(shí)事物的反映和抽象,能幫助我們更好地了解客觀世界。數(shù)據(jù)模型定義了數(shù)據(jù)之間關(guān)系和結(jié)構(gòu),使得我們可以有規(guī)律地獲取想要的數(shù)據(jù)。例如,在一個(gè)超市里,商品的布局都有特定的規(guī)范,商品擺放的位置是按照消費(fèi)者的購(gòu)買(mǎi)習(xí)慣以及人流走向進(jìn)行擺放的。
?
1)數(shù)據(jù)模型的作用
?
數(shù)據(jù)模型是在業(yè)務(wù)需求分析之后,數(shù)據(jù)倉(cāng)庫(kù)工作開(kāi)始時(shí)的第一步。良好的數(shù)據(jù)模型可以幫助我們更好地存儲(chǔ)數(shù)據(jù),更有效率地獲取數(shù)據(jù),保證數(shù)據(jù)間的一致性。
?
2)模型設(shè)計(jì)的基本原則
?
-
高內(nèi)聚和低耦合:一個(gè)邏輯和物理模型由哪些記錄和字段組成,應(yīng)該遵循最基本的軟件設(shè)計(jì)方法論中的高內(nèi)聚和低耦合原則。主要從數(shù)據(jù)業(yè)務(wù)特性和訪問(wèn)特性兩個(gè)角度來(lái)考慮:將業(yè)務(wù)相近或者相關(guān)的數(shù)據(jù)、粒度相同數(shù)據(jù)設(shè)計(jì)為一個(gè)邏輯或者物理模型;將高概率同時(shí)訪問(wèn)的數(shù)據(jù)放一起,將低概率同時(shí)訪問(wèn)的數(shù)據(jù)分開(kāi)存儲(chǔ)。
?
-
核心模型與擴(kuò)展模型分離:建立核心模型與擴(kuò)展模型體系,核心模型包括的字段支持常用核心的業(yè)務(wù),擴(kuò)展模型包括的字段支持個(gè)性化或是少量應(yīng)用的需要。在必須讓核心模型與擴(kuò)展模型做關(guān)聯(lián)時(shí),不能讓擴(kuò)展字段過(guò)度侵入核心模型,以免破壞了核心模型的架構(gòu)簡(jiǎn)潔性與可維護(hù)性。
?
-
公共處理邏輯下沉及單一:底層公用的處理邏輯應(yīng)該在數(shù)據(jù)調(diào)度依賴的底層進(jìn)行封裝與實(shí)現(xiàn),不要讓公用的處理邏輯暴露給應(yīng)用層實(shí)現(xiàn),不要讓公共邏輯在多處同時(shí)存在。
?
-
成本與性能平衡:適當(dāng)?shù)臄?shù)據(jù)冗余可換取查詢和刷新性能,不宜過(guò)度冗余與數(shù)據(jù)復(fù)制。
?
-
數(shù)據(jù)可回滾:處理邏輯不變,在不同時(shí)間多次運(yùn)行數(shù)據(jù)的結(jié)果需確定不變。
?
-
一致性:相同的字段在不同表中的字段名必須相同。
?
-
命名清晰可理解:表命名規(guī)范需清晰、一致,表命名需易于下游的理解和使用。
?
二、公共規(guī)范
?
?
應(yīng)用層應(yīng)優(yōu)先調(diào)用DW公共層數(shù)據(jù),必須存在中間層數(shù)據(jù),不允許應(yīng)用層跨過(guò)中間層從ODS層重復(fù)加工數(shù)據(jù)。一方面,中間層團(tuán)隊(duì)?wèi)?yīng)該積極了解應(yīng)用層數(shù)據(jù)的建設(shè)需求,將公用的數(shù)據(jù)沉淀到公共層,為其他團(tuán)隊(duì)提供數(shù)據(jù)服務(wù);另一方面,應(yīng)用層團(tuán)隊(duì)也需積極配合中間層團(tuán)隊(duì)進(jìn)行持續(xù)的數(shù)據(jù)公共建設(shè)的改造。必須避免出現(xiàn)過(guò)度的ODS層引用、不合理的數(shù)據(jù)復(fù)制以及子集合冗余。
?
-
ODS層數(shù)據(jù)不能被應(yīng)用層任務(wù)引用,中間層不能有沉淀的ODS層數(shù)據(jù),必須通過(guò)CDM層的視圖訪問(wèn)。CDM層視圖必須使用調(diào)度程序進(jìn)行封裝,保持視圖的可維護(hù)性與可管理性。
-
CDM層任務(wù)的深度不宜過(guò)大(建議不超過(guò)10層)。
-
原則上一個(gè)計(jì)算刷新任務(wù)只允許一個(gè)輸出表,特殊情況除外。
-
如果多個(gè)任務(wù)刷新輸出一個(gè)表(不同任務(wù)插入不同的分區(qū)),調(diào)度上需要建立一個(gè)依賴多個(gè)刷新任務(wù)的虛擬任務(wù),通常下游應(yīng)該依賴此虛擬任務(wù)。
-
CDM匯總層應(yīng)優(yōu)先調(diào)用CDM明細(xì)層。在調(diào)用可累加類(lèi)指標(biāo)計(jì)算時(shí),CDM匯總層盡量?jī)?yōu)先調(diào)用已經(jīng)產(chǎn)出的粗粒度匯總層,以避免大量匯總都直接從海量的明細(xì)數(shù)據(jù)層計(jì)算。
-
CDM明細(xì)層累計(jì)快照事實(shí)表優(yōu)先調(diào)用CDM事務(wù)型事實(shí)表,以保持?jǐn)?shù)據(jù)的一致性產(chǎn)出。
-
避免應(yīng)用層過(guò)度引用和依賴CDM層明細(xì)數(shù)據(jù),需有針對(duì)性地建設(shè)好CDM公共匯總層。
?
?
ODS層的數(shù)據(jù)類(lèi)型應(yīng)基于源系統(tǒng)數(shù)據(jù)類(lèi)型轉(zhuǎn)換。如源數(shù)據(jù)為MySQL時(shí)的轉(zhuǎn)換規(guī)則如下:
?
?
CDM數(shù)據(jù)公共層如果是引用ODS層數(shù)據(jù),則默認(rèn)使用ODS層字段的數(shù)據(jù)類(lèi)型。其衍生加工數(shù)據(jù)字段按以下標(biāo)準(zhǔn)執(zhí)行:
?
-
金額類(lèi)及其它小數(shù)點(diǎn)數(shù)據(jù)使用DOUBLE類(lèi)型。
-
字符類(lèi)數(shù)據(jù)使用STRING類(lèi)型。
-
ID類(lèi)和整形數(shù)值使用BIGINT類(lèi)型。
-
時(shí)間類(lèi)型數(shù)據(jù)使用STRING類(lèi)型(如果有特殊的格式強(qiáng)制要求,可以選擇性使用DATETIME類(lèi)型)。
-
狀態(tài)使用STRING類(lèi)型。
?
?
數(shù)據(jù)統(tǒng)計(jì)日期的分區(qū)字段按以下標(biāo)準(zhǔn):
?
-
按天分區(qū):dt(YYYYMMDD)
-
按小時(shí)分區(qū):hh(00-23)
-
按分鐘:mi (00-59)
-
is_{業(yè)務(wù)}:表示布爾型數(shù)據(jù)字段。"Y","N"表示,不允許出現(xiàn)空值域。
-
原則上不需要冗余分區(qū)字段。
?
?
1)相關(guān)數(shù)據(jù)冗余
?
一個(gè)表做寬表冗余維度屬性時(shí),應(yīng)該遵循以下建議準(zhǔn)則:
?
-
冗余字段與表中其它字段高頻率(大于3個(gè)下游應(yīng)用SQL)同時(shí)訪問(wèn)。
-
冗余字段的引入不應(yīng)造成其本身的刷新完成時(shí)間產(chǎn)生過(guò)多后延。
-
公共層數(shù)據(jù)不允許字段重復(fù)率大于60%的相同粒度數(shù)據(jù)表冗余,可以選擇在原表基礎(chǔ)上拓寬或者在下游應(yīng)用中通過(guò)JOIN方式實(shí)現(xiàn)。
?
2)子集合冗余
?
當(dāng)需要從一個(gè)集合中冗余一部分記錄作為另外一張表存在時(shí),可以優(yōu)先考慮子分區(qū)方式,但多級(jí)子分區(qū)不應(yīng)超過(guò)(5級(jí))。只有以下情況才考慮冗余:
?
-
子類(lèi)型表有較多(大于10)個(gè)字段,而父類(lèi)型表并不存在。
-
子集合的過(guò)濾條件會(huì)被多次(大于5次)應(yīng)用。
?
?
數(shù)據(jù)的水平和垂直拆分是按照訪問(wèn)熱度分布和數(shù)據(jù)表"非空或者0值"的數(shù)據(jù)值在行列二維空間上分布情況進(jìn)行劃分的。
?
-
在物理上劃分核心模型和擴(kuò)展模型,將其字段進(jìn)行垂直劃分。
-
將訪問(wèn)相關(guān)度較高的列在一個(gè)表存儲(chǔ),將訪問(wèn)相關(guān)度較低的字段分開(kāi)存儲(chǔ)。
-
將經(jīng)常用到的where條件按記錄行進(jìn)行水平切分或者冗余;水平切分可以考慮二級(jí)分區(qū)手段,以避免多余的數(shù)據(jù)復(fù)制與冗余。
-
將出現(xiàn)大量空值和零值的統(tǒng)計(jì)匯總表,依據(jù)其空值和零值分布狀況可以做適當(dāng)?shù)乃胶痛怪鼻蟹?,以減少存儲(chǔ)和下游的掃描數(shù)據(jù)量。
?
?
-
匯總類(lèi)指標(biāo)的空值:空值處理,填充為零,當(dāng)前DMP基于列存儲(chǔ)的壓縮技術(shù)不會(huì)由于填充大量空值導(dǎo)致存儲(chǔ)成本上升。
-
維度屬性值為空:在匯總到對(duì)應(yīng)維度上時(shí),對(duì)于無(wú)法對(duì)應(yīng)的統(tǒng)計(jì)事實(shí),記錄行會(huì)填充為-99(未知),對(duì)應(yīng)維表會(huì)出現(xiàn)一條-99(未知)的記錄。
?
?
?
三、數(shù)據(jù)存儲(chǔ)及生命周期管理規(guī)范
?
?
?
-
每個(gè)ODS全量表必須配置唯一性字段標(biāo)識(shí)。
-
每個(gè)ODS全量表必須做分區(qū)空數(shù)據(jù)監(jiān)控。
-
建議對(duì)重要表的重要枚舉類(lèi)型字段做枚舉值變化及枚舉值分布監(jiān)控。
-
建議對(duì)ODS表的數(shù)據(jù)量及數(shù)據(jù)記錄數(shù)設(shè)置上周同比無(wú)變化監(jiān)控,用于監(jiān)控源系統(tǒng)是否下線或者已遷移。
-
只有有監(jiān)控要求的表才創(chuàng)建數(shù)據(jù)質(zhì)量管控層,應(yīng)由DMP的數(shù)據(jù)質(zhì)量配置完成。
-
每個(gè)ODS層全表都必須要有注釋。
?
四、CDM公共維度層設(shè)計(jì)規(guī)范
?
?
1)一致性維度規(guī)范
?
公共層的維度表中相同維度屬性在不同物理表中的字段名稱(chēng)、數(shù)據(jù)類(lèi)型、數(shù)據(jù)內(nèi)容必須保持一致。除了以下特例:
?
-
在不同的實(shí)際物理表中,如果由于維度角色的差異,需要使用其他的名稱(chēng),其名稱(chēng)也必須是規(guī)范的維度屬性的別名。比如:定義一個(gè)標(biāo)準(zhǔn)的用戶ID時(shí),如果在一個(gè)表中,分別要表示正式用戶ID,訪客ID,那么設(shè)計(jì)規(guī)范階段就預(yù)先對(duì)用戶ID分別定義正式用戶ID和訪客ID。
-
如果由于歷史原因,在暫時(shí)不一致的情況下,必須在規(guī)范的維度定義一個(gè)標(biāo)準(zhǔn)維度屬性,不同的物理名也必須是來(lái)自標(biāo)準(zhǔn)維度屬性的別名。
?
2)維度的組合與拆分
?
①組合原則
?
-
將維度所描述業(yè)務(wù)相關(guān)性強(qiáng)的字段在一個(gè)物理維表實(shí)現(xiàn),相關(guān)性一般指:經(jīng)常需要一起查詢、報(bào)表展現(xiàn),比如商品基本屬性和所屬品牌;兩個(gè)維度屬性間是否存在天然的關(guān)系等。
-
無(wú)相關(guān)性的維度可以適當(dāng)考慮雜項(xiàng)維度,比如交易,可以構(gòu)建一個(gè)交易雜項(xiàng)維度收集交易的特殊標(biāo)記屬性、業(yè)務(wù)分類(lèi)等信息。也可以將雜項(xiàng)維度退化在事實(shí)表中處理,不過(guò)容易造成事實(shí)表相對(duì)龐大,加工處理較為復(fù)雜。
-
所謂的行為維度是經(jīng)過(guò)匯總計(jì)算的指標(biāo),在下游的應(yīng)用使用時(shí)將其當(dāng)維度處理。如果有需要,度量指標(biāo)可以作為行為維度冗余到維度表中。
?
②拆分與冗余
?
-
對(duì)于維度屬性過(guò)多,涉及源較多的維度表,可以做適當(dāng)拆分。
-
比如用戶表,建議拆分為核心表和擴(kuò)展表。核心表相對(duì)字段較少,刷新產(chǎn)出時(shí)間較早,優(yōu)先使用。擴(kuò)展表字段較多,且可以冗余核心表部分字段,刷新產(chǎn)出時(shí)間較晚,適合數(shù)據(jù)分析人員使用。
-
根據(jù)維度屬性的業(yè)務(wù)不相關(guān)性,將相關(guān)度不大的維度屬性拆分為多個(gè)物理表存儲(chǔ)。
?
-
數(shù)據(jù)記錄數(shù)較大的維度表,可以適當(dāng)冗余一些子集合,以減少下游掃描數(shù)據(jù)量:
-
比如用戶表,可以根據(jù)當(dāng)天是否有行為,產(chǎn)出一個(gè)有活躍行為的相關(guān)維表,以減少應(yīng)用的數(shù)據(jù)掃描量。
-
可根據(jù)所屬業(yè)務(wù)掃描數(shù)據(jù)范圍大小的不同,進(jìn)行適當(dāng)子集合冗余。
?
?
命名規(guī)則:{project_name}.dim{業(yè)務(wù)/pub}{維度定義}[_{自定義命名標(biāo)簽}],所謂的pub是類(lèi)似與具體業(yè)務(wù)無(wú)關(guān),各個(gè)業(yè)務(wù)部都可以共用,例如時(shí)間維度。
?
?
CDM公共維度層的表的類(lèi)型為維度表,存儲(chǔ)方式為按天分區(qū)。
?
最長(zhǎng)存儲(chǔ)保留策略:
?
模型設(shè)計(jì)者根據(jù)自身業(yè)務(wù)需求設(shè)置表的生命周期管理。您可依據(jù)3個(gè)月內(nèi)的最大需要訪問(wèn)的跨度設(shè)置保留策略,具體計(jì)算方式如下。
?
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于4天時(shí),建議將保留天數(shù)設(shè)為7天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于12天時(shí),建議將保留天數(shù)設(shè)為15天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于30天時(shí), 建議將保留天數(shù)設(shè)為33天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于90天時(shí),建議將保留天數(shù)設(shè)為93天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于180天時(shí), 建議將保留天數(shù)設(shè)為183天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于365天時(shí),建議將保留天數(shù)設(shè)為368天。
?
五、CDM明細(xì)層設(shè)計(jì)規(guī)范
?
?
命名規(guī)則:{project_name}.dwd{業(yè)務(wù)縮寫(xiě)/pub}{數(shù)據(jù)域縮寫(xiě)}{業(yè)務(wù)過(guò)程縮寫(xiě)}[{自定義表命名標(biāo)簽縮寫(xiě)}]{刷新周期標(biāo)識(shí)}{單分區(qū)增量全量標(biāo)識(shí)}。
?
說(shuō)明:
?
-
pub表示數(shù)據(jù)包括多個(gè)業(yè)務(wù)的數(shù)據(jù)。
-
單分區(qū)增量全量標(biāo)識(shí):i表示增量,f表示全量。
?
?
CDM明細(xì)層的表的類(lèi)型為事實(shí)表,存儲(chǔ)方式為按天分區(qū)。
?
事務(wù)型事實(shí)表一般永久保存。周期性快照事實(shí)表根據(jù)業(yè)務(wù)需求設(shè)置生命周期管理。您可依據(jù)3個(gè)月內(nèi)的最大需要訪問(wèn)的跨度設(shè)置保留策略,具體計(jì)算方式如下:
?
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于4天時(shí),建議將保留天數(shù)設(shè)為7天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于12天時(shí),建議將保留天數(shù)設(shè)為15天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于30天時(shí), 建議將保留天數(shù)設(shè)為33天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于90天時(shí),建議將保留天數(shù)設(shè)為93天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于180天時(shí), 建議將保留天數(shù)設(shè)為183天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于365天時(shí),建議將保留天數(shù)設(shè)為368天。
?
?
事務(wù)型事實(shí)表主要用于分析行為與追蹤事件。事務(wù)事實(shí)表獲取業(yè)務(wù)過(guò)程中的事件或者行為細(xì)節(jié),然后通過(guò)事實(shí)與維度之間關(guān)聯(lián),可以非常方便地統(tǒng)計(jì)各種事件相關(guān)的度量,比如瀏覽UV,搜索次數(shù)等等。
?
-
基于數(shù)據(jù)應(yīng)用需求的分析設(shè)計(jì)事務(wù)型事實(shí)表,如果下游存在較大的針對(duì)某個(gè)業(yè)務(wù)過(guò)程事件的分析指標(biāo)需求,可以考慮基于某一個(gè)事件過(guò)程構(gòu)建事務(wù)型事實(shí)表。
-
事務(wù)型事實(shí)表一般選用事件發(fā)生日期或時(shí)間作為分區(qū)字段,這種分區(qū)方式可以方便下游的作業(yè)數(shù)據(jù)掃描執(zhí)行分區(qū)裁剪。
-
明細(xì)層事實(shí)表的冗余子集的原則能有利于降低上層數(shù)據(jù)訪問(wèn)的IO開(kāi)銷(xiāo)。
-
明細(xì)層事實(shí)表維度退化到事實(shí)表原則能有利于減少上層數(shù)據(jù)訪問(wèn)的JOIN成本。
?
?
周期快照型事實(shí)表主要用于分析狀態(tài)型或者存量型事實(shí),快照是指以預(yù)定的時(shí)間間隔來(lái)采樣狀態(tài)度量。
?
?
累計(jì)快照事實(shí)表是基于多個(gè)業(yè)務(wù)過(guò)程聯(lián)合分析從而構(gòu)建的事實(shí)表,如采購(gòu)單的流轉(zhuǎn)環(huán)節(jié)等。
?
累計(jì)快照事實(shí)表主要用于分析事件之間的時(shí)間間隔與周期,比如用交易的支付與發(fā)貨之間的間隔,來(lái)分析發(fā)貨速度,或在支付和退款環(huán)節(jié)分析支付退款率等等;同時(shí)也可以用于幫助分析一些少量的、且對(duì)刷新時(shí)間不是非常敏感的指標(biāo)統(tǒng)計(jì),比如,在當(dāng)前事務(wù)型事實(shí)表不支持,且只有少量的統(tǒng)計(jì)指標(biāo)時(shí),需分析交易的關(guān)閉和發(fā)貨,就可以基于累計(jì)快照事實(shí)表進(jìn)行計(jì)算。
?
六、CDM匯總層設(shè)計(jì)規(guī)范
?
?
命名規(guī)則:{project_name}.dws{業(yè)務(wù)縮寫(xiě)/pub}{數(shù)據(jù)域縮寫(xiě)}{數(shù)據(jù)粒度縮寫(xiě)}[{自定義表命名標(biāo)簽縮寫(xiě)}]{統(tǒng)計(jì)時(shí)間周期范圍縮寫(xiě)}{刷新周期標(biāo)識(shí)}{單分區(qū)增量全量標(biāo)識(shí)}。
?
說(shuō)明:
?
-
關(guān)于統(tǒng)計(jì)時(shí)間周期范圍縮寫(xiě),在缺省情況下,離線計(jì)算應(yīng)該包括最近一天(1d),最近N天(nd)和歷史截至當(dāng)天(td)三個(gè)表,如果出現(xiàn)nd的表的字段過(guò)多,需要拆分時(shí),只允許以一個(gè)統(tǒng)計(jì)周期單元作為原子拆分,即一個(gè)統(tǒng)計(jì)周期拆分一個(gè)表,比如最近7天(_1w)拆分一個(gè)表;不允許拆分出來(lái)的一個(gè)表存儲(chǔ)多個(gè)統(tǒng)計(jì)周期的。
-
對(duì)于{刷新周期標(biāo)識(shí)}和{單分區(qū)增量全量標(biāo)識(shí)}在匯總層不做強(qiáng)制要求。單分區(qū)增量全量標(biāo)識(shí):i:表示增量,f表示全量。
-
對(duì)于小時(shí)表不管是按天刷新還是按小時(shí)刷新, 都用_hh 來(lái)表示。
-
對(duì)于分鐘表不管是按天刷新還是按小時(shí)刷新,都用_mm來(lái)表示。
?
?
CDM匯總層的表的類(lèi)型為事實(shí)表,存儲(chǔ)方式為按天分區(qū)。
?
事務(wù)型事實(shí)表一般永久保存。周期性快照事實(shí)表根據(jù)業(yè)務(wù)需求設(shè)置生命周期管理。您可依據(jù)3個(gè)月內(nèi)的最大需要訪問(wèn)的跨度設(shè)置保留策略,具體計(jì)算方式如下:
?
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于4天時(shí),建議將保留天數(shù)設(shè)為7天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于12天時(shí),建議將保留天數(shù)設(shè)為15天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于30天時(shí), 建議將保留天數(shù)設(shè)為33天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于90天時(shí),建議將保留天數(shù)設(shè)為93天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于180天時(shí), 建議將保留天數(shù)設(shè)為183天。
-
當(dāng)3個(gè)月內(nèi)的最大訪問(wèn)跨度小于或等于365天時(shí),建議將保留天數(shù)設(shè)為368天。
?
七、表設(shè)計(jì)規(guī)范
?
DMP中不同類(lèi)型計(jì)算任務(wù)的操作對(duì)象(輸入、輸出)都是表。表設(shè)計(jì)是否合理將影響存儲(chǔ)和計(jì)算的性能,進(jìn)而影響到存儲(chǔ)和計(jì)算的計(jì)費(fèi)。
?
?
1)降低存儲(chǔ)成本
?
合理的表設(shè)計(jì)可以降低數(shù)據(jù)分層設(shè)計(jì)上的冗余存儲(chǔ),減少中間表的數(shù)據(jù)量大小。對(duì)表數(shù)據(jù)的生命周期進(jìn)行正確地管理,也能夠直接降低存儲(chǔ)的數(shù)據(jù)量及存儲(chǔ)成本。
?
2)降低計(jì)算成本
?
規(guī)范化的表設(shè)計(jì)可以幫助使用者優(yōu)化數(shù)據(jù)的讀取,從而減少計(jì)算過(guò)程中的冗余讀寫(xiě)和計(jì)算,提升計(jì)算性能,降低計(jì)算成本。
?
3)降低維護(hù)復(fù)雜度
?
規(guī)范化的表分層設(shè)計(jì)能夠直接體現(xiàn)業(yè)務(wù)的特點(diǎn)。例如,在規(guī)范化設(shè)計(jì)表的同時(shí)對(duì)數(shù)據(jù)通道中的數(shù)據(jù)采集方式進(jìn)行優(yōu)化,可以減少分布式系統(tǒng)中小文件的問(wèn)題,降低表和分區(qū)維護(hù)的數(shù)量等復(fù)雜度。
?
?
1)表設(shè)計(jì)所影響的操作:表創(chuàng)建、入數(shù)據(jù)、表更新、表刪除、表管理。
?
2)導(dǎo)入數(shù)據(jù)場(chǎng)景(區(qū)分要做實(shí)時(shí)數(shù)據(jù)采集還是離線批量數(shù)據(jù)寫(xiě)入):
?
-
導(dǎo)入即查詢與計(jì)算
-
多次導(dǎo)入,定時(shí)查詢與計(jì)算
-
導(dǎo)入后生成中間表進(jìn)行計(jì)算
?
說(shuō)明:
?
-
合理的表設(shè)計(jì)和數(shù)據(jù)集成周期管理能夠降低數(shù)據(jù)在存儲(chǔ)期間的成本。
-
DMP優(yōu)先計(jì)算批量數(shù)據(jù)集成庫(kù)并按業(yè)務(wù)邏輯進(jìn)行計(jì)算,例如按照分區(qū)進(jìn)行計(jì)算。
-
導(dǎo)入后立即查詢與計(jì)算,需要考慮每次導(dǎo)入的數(shù)據(jù)量,減少流式小量數(shù)據(jù)導(dǎo)入。
-
不合理的數(shù)據(jù)導(dǎo)入及存儲(chǔ)(小文件)會(huì)影響整體的存儲(chǔ)性能、計(jì)算性能、運(yùn)維穩(wěn)定性。
?
?
-
確定所屬項(xiàng)目空間,依據(jù)業(yè)務(wù)過(guò)程規(guī)劃表類(lèi)型,分析數(shù)據(jù)層次。
-
定義表描述,進(jìn)行權(quán)限定義與Owner定義。
-
依據(jù)數(shù)據(jù)量、數(shù)據(jù)集成特點(diǎn)定義分區(qū)表或非分區(qū)表。
-
定義字段或分區(qū)字段。
-
進(jìn)行表創(chuàng)建、表轉(zhuǎn)換。
-
明確導(dǎo)入數(shù)據(jù)場(chǎng)景的相關(guān)因素(包括批量數(shù)據(jù)寫(xiě)入、流式數(shù)據(jù)寫(xiě)入、條式數(shù)據(jù)插入)。
-
定義表和分區(qū)數(shù)據(jù)生命周期。
?
說(shuō)明:
?
-
創(chuàng)建完表后,您可以依據(jù)業(yè)務(wù)變化修改表的schema,例如設(shè)置生命周期:RangeClustering。
-
在表設(shè)計(jì)階段,需要特別注意區(qū)分?jǐn)?shù)據(jù)的場(chǎng)景(批量數(shù)據(jù)寫(xiě)入、流式數(shù)據(jù)寫(xiě)入、周期性條式數(shù)據(jù)插入)。
-
合理使用非分區(qū)表和分區(qū)表。建議采用分區(qū)表來(lái)設(shè)計(jì)日志表、事實(shí)表,原始采集表等,并按照時(shí)間進(jìn)行分區(qū)。
-
注意各種表和分區(qū)的限制條件。
?
?
1)按數(shù)據(jù)分層規(guī)范數(shù)據(jù)的生命周期
?
-
源表ODS層:每天從業(yè)務(wù)系統(tǒng)同步過(guò)來(lái)的數(shù)據(jù),全部保留,生命周期定義永久保存。當(dāng)下游數(shù)據(jù)受損時(shí),可以從ODS恢復(fù)數(shù)據(jù)。若ODS每天同步過(guò)來(lái)的是全量表,則可以通過(guò)全表拉鏈的方式來(lái)壓縮存儲(chǔ)。
-
數(shù)據(jù)倉(cāng)庫(kù)(基礎(chǔ))層:?至少保留一份完整的全量數(shù)據(jù)(不必像ODS那樣存儲(chǔ)冗余的全量表)。您可以通過(guò)拆表或者做分區(qū)來(lái)提升性能。
-
數(shù)據(jù)集市層:數(shù)據(jù)將被按需保留1~3年。數(shù)據(jù)集市的數(shù)據(jù)比較容易生成,所以無(wú)需保留久遠(yuǎn)的歷史數(shù)據(jù)。
?
2)按數(shù)據(jù)的變更和歷史規(guī)范數(shù)據(jù)的保存
?
-
客戶屬性、產(chǎn)品屬性不斷在變更。將這些屬性的歷史變化情況記錄下來(lái),以便追溯某個(gè)時(shí)點(diǎn)的值。
-
在事實(shí)表里冗余維表的字段,即把"事件發(fā)生時(shí)"的各種維度屬性值與該事件綁定起來(lái)。使用者無(wú)需關(guān)聯(lián)多張表就可以使用數(shù)據(jù)。此方式僅可應(yīng)用于數(shù)據(jù)應(yīng)用層。
-
用拉鏈表或者日快照的形式,記錄維表的變化情況。這使得數(shù)據(jù)結(jié)構(gòu)變得靈活、易于擴(kuò)展,數(shù)據(jù)一致性得到了增強(qiáng),數(shù)據(jù)加工者可以更加方便地管理數(shù)據(jù)。此方式僅可應(yīng)用于數(shù)據(jù)基礎(chǔ)層。
?
?
通道類(lèi)型:
?
-
Datahub:規(guī)劃寫(xiě)入的分區(qū)與寫(xiě)入流量之間的關(guān)系,做到每64M進(jìn)行一次commit。
-
數(shù)據(jù)集成或DataX:規(guī)劃寫(xiě)入的表分區(qū)的頻率,做到每64M進(jìn)行一次commit,以免commit空目錄。
-
DTS:規(guī)劃寫(xiě)入的表存量分區(qū)與增量分區(qū)的關(guān)系,設(shè)置commit頻率。
-
Console(Run SQL or Tunnel upload):需要避免高頻小數(shù)據(jù)量文件的插入或者上傳。
-
SDK執(zhí)行SQL的insert into語(yǔ)句:對(duì)表或者分區(qū)上傳時(shí)需要注意在插入到分區(qū)后使用merge語(yǔ)句進(jìn)行小文件整理操作,以免對(duì)一個(gè)分區(qū)或者非分區(qū)表插入多次。
?
說(shuō)明:
?
-
DMP導(dǎo)入數(shù)據(jù)的通道只能是Tunnel SDK或執(zhí)行SQL的insert into語(yǔ)句,請(qǐng)避免流式插入。
-
以上各通道本身均由自身邏輯進(jìn)行流式數(shù)據(jù)寫(xiě)入、批量數(shù)據(jù)寫(xiě)入、周期調(diào)度寫(xiě)入。
-
當(dāng)使用數(shù)據(jù)通道寫(xiě)入表或分區(qū)時(shí),需將一次寫(xiě)入的數(shù)據(jù)量控制在合理范圍,例如64M以上。
?
?
一張表里有很多個(gè)一級(jí)分區(qū),每個(gè)一級(jí)分區(qū)都會(huì)按時(shí)間存儲(chǔ)二級(jí)分區(qū),每個(gè)二級(jí)分區(qū)都會(huì)存儲(chǔ)所有的列。
?
-
請(qǐng)?jiān)O(shè)置分區(qū)的數(shù)量上限。
-
請(qǐng)避免每個(gè)分區(qū)中只存少量數(shù)據(jù)。
-
分區(qū)的條件設(shè)置應(yīng)以方便數(shù)據(jù)的查詢和計(jì)算為前提。
-
避免每個(gè)分區(qū)中出現(xiàn)多次的數(shù)據(jù)寫(xiě)入。
?
?
1)所有的表、字段名要使用統(tǒng)一的命名規(guī)范:
?
-
命名應(yīng)能區(qū)分該表的業(yè)務(wù)類(lèi)型。
-
命名應(yīng)能區(qū)分該表是"事實(shí)表"或"維度表"、"日志表"、"極限存儲(chǔ)表"(待發(fā)布的功能)。
-
命名應(yīng)能區(qū)分該表的實(shí)體信息。
?
2)不同表中具有相同業(yè)務(wù)含義的字段要定義成統(tǒng)一的數(shù)據(jù)類(lèi)型,避免不必要的類(lèi)型轉(zhuǎn)換。
?
3)分區(qū)設(shè)計(jì)及使用規(guī)則:
?
-
支持新增分區(qū),不支持新增分區(qū)字段。
-
單表支持分區(qū)數(shù)量為6萬(wàn)。
-
對(duì)于多級(jí)分區(qū)的表,如果想添加新的分區(qū),則必須指明全部的分區(qū)值。
-
不支持修改分區(qū)列的列名,只能修改分區(qū)列對(duì)應(yīng)的值。修改多級(jí)分區(qū)的一個(gè)或者多個(gè)分區(qū)值時(shí),多級(jí)分區(qū)的每一級(jí)的分區(qū)值都必須寫(xiě)上。
?
?
1)分區(qū)字段和普通字段的選擇
?
通過(guò)分區(qū)字段,您可以劃分?jǐn)?shù)據(jù)掃描范圍,更加方便地管理數(shù)據(jù)。
?
您在可以在創(chuàng)建表時(shí)設(shè)置普通字段和分區(qū)字段。通常,普通字段可以被理解為數(shù)據(jù)文件的數(shù)據(jù),而分區(qū)字段可以被理解為文件系統(tǒng)的目錄。表的存儲(chǔ)空間的占用主要是普通字段的空間占用。
?
分區(qū)列雖不直接存儲(chǔ)數(shù)據(jù),但如同文件系統(tǒng)里的目錄,可以方便您管理數(shù)據(jù)。例如,在計(jì)算時(shí)若指定具體的分區(qū),則計(jì)算過(guò)程中只需查詢對(duì)應(yīng)分區(qū),從而減少計(jì)算輸入量。
?
分區(qū)表的分區(qū)列的級(jí)數(shù)不能超過(guò)6級(jí),即底層存儲(chǔ)數(shù)據(jù)的目錄層數(shù)不能超過(guò)6層。您應(yīng)為分區(qū)表設(shè)置合適的生命周期。當(dāng)部分?jǐn)?shù)據(jù)的生命周期與其它數(shù)據(jù)不同時(shí),您可以通過(guò)細(xì)粒度分區(qū)實(shí)現(xiàn)對(duì)部分?jǐn)?shù)據(jù)的管理。
?
說(shuō)明:
?
-
設(shè)置分區(qū)字段時(shí),您可以從數(shù)據(jù)管理和常用的數(shù)據(jù)掃描方面考慮,來(lái)選擇對(duì)應(yīng)的字段。
-
不具備規(guī)律或類(lèi)型數(shù)量大于10000且不經(jīng)常作為查詢條件的字段,應(yīng)被設(shè)置成普通字段。
-
分區(qū)字段定義依據(jù)
?
2)按優(yōu)先級(jí)高低排序
?
-
分區(qū)列的選擇應(yīng)充分考慮時(shí)間因素,盡量避免對(duì)于存量分區(qū)進(jìn)行更新。
-
如果有多個(gè)事實(shí)表(不包括維度表)進(jìn)行join,應(yīng)將查詢條件where范圍的列作為分區(qū)列。
-
選擇group by或distinct包含的列作為分區(qū)列。
-
選擇值分布均勻的列,而不要選擇分區(qū)傾斜的列作為分區(qū)列。
-
常用SQL語(yǔ)句中若經(jīng)常包含某列的等值或in的查詢條件,則選擇該列作為分區(qū)列。例如:
?
select … from** table where id =123 and** ….;
?
3)分區(qū)個(gè)數(shù)定義依據(jù)
?
-
時(shí)間分區(qū):建議按天或月進(jìn)行分區(qū)。如果按小時(shí)進(jìn)行分區(qū),則二級(jí)分區(qū)的平均數(shù)量不應(yīng)超過(guò)8個(gè)。
-
地域分區(qū):若對(duì)省、市、縣進(jìn)行分區(qū),則應(yīng)考慮進(jìn)行多級(jí)分區(qū)。23個(gè)省,5個(gè)自治區(qū),4個(gè)直轄市,2個(gè)特別行政區(qū),50個(gè)地區(qū)(州、盟),661個(gè)市(其中直轄市4個(gè)、地級(jí)市283個(gè)、縣級(jí)市374個(gè)),1636個(gè)縣(自治縣、旗、自治旗、特區(qū)和林區(qū)),按照最細(xì)粒度縣進(jìn)行分區(qū)后,不應(yīng)再按照更細(xì)粒度小時(shí)進(jìn)行分區(qū)。
-
單分區(qū)與多級(jí)分區(qū):在單分區(qū)下,建議每次提交64M數(shù)據(jù)。如果為多級(jí)分區(qū),則需保證每個(gè)最細(xì)粒度級(jí)分區(qū)下的二級(jí)分區(qū)的數(shù)據(jù)都遵循單分區(qū)個(gè)數(shù)規(guī)則。
-
單表分區(qū):單表分區(qū)數(shù)(包括下級(jí)分區(qū))不能超過(guò)6萬(wàn)。
?
3)分區(qū)數(shù)量和數(shù)據(jù)量建議
?
-
在計(jì)算的時(shí)候可以使用分區(qū)裁剪是分區(qū)的優(yōu)勢(shì)。
-
建議單個(gè)分區(qū)中數(shù)據(jù)量不要太大。
-
應(yīng)盡量避免分區(qū)數(shù)據(jù)傾斜,避免單個(gè)表不同分區(qū)的數(shù)據(jù)量差異超過(guò)100萬(wàn)。
-
做分區(qū)設(shè)計(jì)時(shí)應(yīng)合理規(guī)劃分區(qū)個(gè)數(shù),較細(xì)粒度的分區(qū)在跨分區(qū)掃描時(shí)會(huì)影響到SQL的執(zhí)行性能。
-
單個(gè)分區(qū)中數(shù)據(jù)量較大的情況下,DMP執(zhí)行任務(wù)時(shí)會(huì)做分片處理不影響分區(qū)裁剪的優(yōu)勢(shì)。
-
單個(gè)分區(qū)中文件數(shù)較多時(shí),會(huì)影響DMP Instance數(shù)量,造成資源浪費(fèi)和SQL性能的影響。
-
采用多級(jí)分區(qū),先按日期分區(qū),然后按交易類(lèi)型分區(qū)。
-
拆表,一種交易類(lèi)型獨(dú)立成一張表,然后每張表按日期分區(qū)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-710455.html
-
維度表不做分區(qū)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-710455.html
到了這里,關(guān)于數(shù)倉(cāng)建設(shè)七大規(guī)范指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!