數據倉庫之分層模型

一、各行業使用的分層模型

不同的行業使用的分層也有所不同,但思想都差不多

1.電信通訊

stage層 ->bdl層 ->analysis層

2.傳統金融/保險

ods層 ->pdm層 ->dm層

3.互聯網金融/電商

odl層 ->bdl層 ->idl層 ->adl層

二、專業術語

ODL層 (Operational Data Layer):操作數據層
  保存原始數據。外部數據什麼樣,該層數據就是什麼樣(關係型數據庫、JSON格式等)。

BDL層 (Base Data Layer):基礎數據層
  做統一的清洗處理。去重、去噪、字典翻譯、空值轉化,日期格式化等操作。

IDL層 (Interface Data Layer):接口層,也稱主題表,寬表
  業務數據底表。在bdl層上,join各表後產生業務所需要的完整數據。

ADL層(Application Data Layer):應用層 ,也稱數據集市**
  與需求對接。由idl層基於某些維度的深度加工統計彙總等操作轉化而來,涉及到多個主題以及tmp數據之間的關聯JOIN後的結果。

DIM層(Dictionary Data Layer):字典層,又稱dic層
  存儲一些諸如省、市、縣區域表、渠道列表、商品類目等等表數據,可以從數據源sqoop導入。

TMP層(Temporary Data Layer):臨時層
  存儲一些中間計算結果

image

  1. 層次間的轉換沒必要循規蹈矩,按部就班,適當做到靈活,避免重複清洗浪費資源
  2. ODL層乾淨的關係型數據可以直接轉換爲IDL層數據,減少計算量
  3. ODL層側重與外部對接,BDL層/TMP層/IDL層側重清洗,IDL層和ADL層側重對外提供應用服務
  4. 層數太少不夠靈活,太多則在數據推翻重洗耗時,時間成本(一個坑)
  5. 數據源提供的數據越詳細越好,避免後期大量重複的清洗工作。

此外,大家可能經常聽到“星型模型”和“雪花模型”,簡單解釋下
(1)星型模型:事實表+維度表(區域、類目、性別...)等多表通過預先JOIN冗餘到一張寬表裏去,常見IDL層。
(2)雪花模型:在計算的時候,纔將事實表跟維度表做join。

現在一般都是採用(1)的模式,爲什麼呢? 預先計算,提高性能,避免後續重複計算。CPU和內存的資源永遠比磁盤空間寶貴的多。至於(2)的方式,有點就是靈活,不需要太多的重複清洗,但是性能不如(1).

  數據倉庫的建設需要從從需求出發,逆推應用層ADL結構,進而推導出它涉及的主題表IDL表結構,再推導可能涉及的基礎表BDL表結構,最後分析所需的數據源取自何處。需求需要包含“明確”需求和“潛在”需求。

三、開發步驟

  1. 創建ODL、BDL、IDL、ADL層表結構(HQL)
  2. 確定數據抽取方案(增量或全量)
  3. 編寫sqoop腳本將數據同步到dim層、使用腳本將源數據同步到odl層
  4. 編寫ODL->BDL->IDL->ADL層ETL清洗腳本(HQL)
  5. 確保上一層的數據穩定,減少對下一層的影響
  6. 編寫azkaban、Ooize腳本
  7. 打通Kylin、FineBI、Hive關係,實現數據可視化、可導出目標

四、HIVE開發規範

表命名規範

ODL層:表名前綴 odl_
BDL層:表名前綴 bdl_
IDL層:表名前綴 idl_
ADL層:表名前綴 adl_
TMP表:表名前綴 tmp_
DIM表:表名前綴 dim_

外部表和內部表

儘量使用內部表。從數據安全的角度考慮,源數據可能被丟失,損壞,而這些情況在hadoop集羣上發生的機率更小

建表規範

  • 每個表增加個ds時間分區,表示數據是哪一天的,也方便重跑數據
  • boolean類型統一使用0或1
  • 錢相關的金額建議使用decimal,而非double ,避免一些計算導致精度不準確
  • 日期格式使用 YYYY-MM-DD HH:MM:SS 、YYYY-MM-DD或 YYYYMMDD格式
  • ...

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章