本文為您介紹建設MaxCompute數據倉庫的公共規范。
層次調用約定
應用層應優先調用公共層數據,必須存在中間層CDM數據,不允許應用層跨過中間層CDM從ODS層重復加工數據。
中間層CDM需要積極了解應用層數據的建設需求,將公用的數據沉淀到公共層,為其他層提供數據服務。應用層需要積極配合中間層CDM持續改造公共層。必須避免出現過度的引用ODS層、不合理的數據復制以及子集合冗余。
ODS層數據不能被應用層任務引用,中間層CDM不能有沉淀的ODS層數據,必須通過CDM層的視圖訪問。CDM層視圖必須使用調度程序進行封裝,保持視圖的可維護性與可管理性。
CDM層任務的深度不宜過大(建議不超過10層)。
原則上一個計算刷新任務只允許一個輸出表。
如果多個任務刷新輸出一個表(不同任務插入不同的分區),DataWorks上需要建立一個依賴多個刷新任務的虛擬任務,通常下游應該依賴此虛擬任務。
CDM匯總層應優先調用CDM明細層。在調用可累加類指標計算時,CDM匯總層盡量優先調用已經產出的粗粒度匯總層,以避免大量匯總直接從海量的明細數據層計算。
CDM明細層累計快照事實表優先調用CDM事務型事實表,以保持數據的一致性產出。
避免應用層過度引用和依賴CDM層明細數據,需要針對性地建設好CDM公共匯總層。
MaxCompute項目分配
按實際需求分配不同的ODS和CDM項目。一個ODS層項目對應一個CDM項目。例如:
ODS層項目,按業務部門的粒度建立。
CDM層項目,按業務部門的粒度建立。
ADS層項目,按應用的粒度建立。
一個項目的劃分結構如下圖所示。
項目命名規范
ODS層項目名稱以
ods
為后綴,例如tb_ods
。中間層CDM項目名稱以
cdm
為后綴,例如tb_cdm
。應用層項目中,數據報表、數據分析等應用名稱以
bi
為后綴,例如tb_bi
;而數據產品等應用名稱以app
為后綴,例如sycm_app
。
數據類型規范
ODS層的數據類型應基于源系統數據類型轉換。例如,源數據為MySQL時的轉換規則如下。
更多MaxCompute與其他數據庫的映射關系,請參見與Hive、MySQL、Oracle數據類型映射表。
MySQL數據類型 | MaxCompute數據類型 |
TINYINT | TINYINT |
SMALLINT/MEDIUMINT | SMALLINT |
INT | INT |
BIGINT | BIGINT |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
DECIMAL | DECIMAL |
CHAR/VARCHAR | VARCHAR |
LONGTEXT/TEXT | STRING |
TIME/YEAR | STRING |
DATE | DATE |
TIMESTAMP | TIMESTAMP |
DATETIME | DATETIME |
CDM數據公共層如果是引用ODS層數據,則默認使用ODS層字段的數據類型。其衍生加工數據字段按以下標準執行:
金額類及其它小數點數據使用DOUBLE類型。
字符類數據使用STRING類型。
ID類和整型數值使用BIGINT類型。
時間類型數據使用STRING類型(如果有特殊的格式要求,可以選擇性使用DATETIME類型)。
狀態使用STRING類型。
公共字段定義規范
數據統計日期的分區字段按以下標準:
按天分區:ds(YYYYMMDD)。
按小時分區:hh(00~23)。
按分鐘:mi(00~59)。
is_{業務}:表示布爾型數據字段。以Y和N表示,不允許出現空值域。
原則上不需要冗余分區字段。
數據冗余
一個表做寬表冗余維度屬性時,應該遵循以下建議準則:
冗余字段與表中其它字段高頻率(大于3個下游應用SQL)同時訪問。
冗余字段的引入不應造成其本身的刷新完成時間產生過多后延。
公共層數據不允許字段重復率大于60%的相同粒度數據表冗余,可以選擇在原表基礎上拓寬或者在下游應用中通過JOIN方式實現。
數據拆分
數據的水平和垂直拆分是按照訪問熱度分布和數據表非空數據值、零數據值在行列二維空間上分布情況進行劃分的。
在物理上劃分核心模型和擴展模型,將其字段進行垂直劃分。
將訪問相關度較高的列在一個表存儲,將訪問相關度較低的字段分開存儲。
將經常用到的Where條件按記錄行進行水平切分或者冗余。水平切分可以考慮二級分區手段,以避免多余的數據復制與冗余。
將出現大量空值和零值的統計匯總表,依據其空值和零值分布狀況可以做適當的水平和垂直切分,以減少存儲和下游的掃描數據量。
空值處理原則
匯總類指標的空值:空值處理,填充為零,當前MaxCompute基于列存儲的壓縮技術不會由于填充大量空值導致存儲成本上升。
維度屬性值為空:在匯總到對應維度上時,對于無法對應的統計事實,記錄行會填充為-99(未知),對應維表會出現一條-99(未知)的記錄。