數據倉庫分層架構
數據倉庫我們一般分為接入層、明細層、實體層、主題層、應用層。各層存儲的數據粒度不同。
接入層:一般存儲接收的原始數據,并給接入的數據打上接收時間戳。
明細層:一般存儲合并后的全量原始數據。
實體層:按照業務實體生成的寬表。
主題層:按照業務主題匯聚的數據集。
應用層:按照具體應用匯聚的數據集。
下面我們逐層介紹各層數據表的應用標準規范。
接入層
從源系統接入的數據,數據格式與源系統保持一致,每次增量插入。
(1)建表規范:
字段基礎類型以“select toTypeName({col}) from jdbc(‘{datasource}’,’select {col} from {table}’) limit 1”查詢結果為準。
添加入庫時間odgTime數據類型為時間類型,用來與源庫中的數據進行對賬。
建表時排序鍵處理:以 CityHash64(*)as __allCityHash64作為排序鍵。
需設置采樣鍵為,__allCityHash64。
(2)數據清理策略:
保留時長:7天(入倉時間),自動刪除語句為 “TTL odgTime + toIntervalDay(7)”。
(3)數據模型設計流程:
1)確定數據源表
2)通過JDBC獲取技術元數據
3)創建物理表
4)添加數據表、字段、表關系元數據
明細層
明細層中的數據是基于接入層的原始數據進行數據清洗,去重等處理過程,得到擁有高質量的數據。
(1)建表規則:
所有表必備三個字段:pkTuple(由主鍵字段組成的元組,Tuple類型);pkHash(pkTuple通過cityHash64計算值,Int64類型); odgTime(更新時間,DateTime類型)。
建表時排序鍵處理:用源表業務主鍵作為排序鍵。
(2)去重規則:
按照業務主鍵取最新,若無明確業務主鍵情況,則所有業務數據列為業務主鍵。
(3)數據清理策略:
永久保存。
(4)數據模型設計流程:
1)根據接入層對應數據表創建物理表
2)添加數據表、字段、表關系元數據
實體層
按照業務域,以邏輯實體為基礎,增加技術屬性生成的物理表。
(1)實體設計原則:
遵從業務模型,兼顧數據來源。維度原則性不退化,不丟屬性。
(2)合寬表原則:
被合并的實體存在共同的業務主鍵。
(3)更新規范:
增量更新,相同業務主鍵,數據取最新。
(4)數據清理策略:
數據永久保存
(5)建表規則:
所有表必備三個字段:pkTuple(由主鍵字段組成的元組,Tuple類型);pkHash(pkTuple通過cityHash64計算值,Int64類型); odgTime(更新時間,DateTime類型)。
建表時排序鍵:實體主鍵。
(6)數據模型設計流程:
1)根據邏輯模型添加數倉必需字段信息,創建物理表
2)添加數據表、字段、表關系元數據
主題層
按照業務域,依據指標說明進行匯總。
(1)設計原則:
按照“實體基本信息+維度+統計指標集”原則設計主題層表。例如生產廠指標集表,由生產廠編號、名稱等基本信息,月份、取值科目(業務收入類型)等維度,產值、生產成本等指標構成。
(2)更新規則:
全量更新為主,增量(數據量超千萬時)更新為輔。
(3)轉存規則:
落表后推送交互區。
(4)建表規則:
所有表必備三個字段:pkTuple(由主鍵字段組成的元組,Tuple類型);pkHash(pkTuple通過cityHash64計算值,Int64類型); odgTime(更新時間,DateTime類型)。
(5)數據模型設計流程:
1)梳理指標集,按照實體確定業務字段信息
2)按照建表規則創建物理表
3)添加數據表、字段、表關系元數據
應用層
應用層的數據是經過最終匯總出來的數據,用來支撐前端報表、BI系統、分析系統的展示。
(1)設計原則:
報表類數據表,以報表展示的數據列為列,行按照報表篩選條件展開。
詳細數據類數據表,以前臺使用為基礎定義列,建立分布式表,直接從實體層或主題層取數。
(2)更新規則:
報表類數據表全量更新。
詳細數據類型數據表,由實體層、主題層更新。
(3)轉存規則:
報表類數據表落表后推送交互區。
原則嚴禁存詳細數據,詳細數據均由分布式表實現。
(4)建表規則:
原則上按照篩選條件、匯總條件設計預計算規則,必須存在能標識數據唯一性的主鍵。
(6)數據模型設計流程:
1)梳理應用需求,確定字段信息
2)按照建表規則創建物理表
3)添加數據表、字段、表關系元數據
知識庫
知識庫可以被各層使用,由代碼表、映射表構成。
(1)維護策略:
原則上,每個知識庫每張表來源唯一,且有責任人。
(2)設計規范:
維度代碼為數字(現狀多以字母加數字,不調整)。
(3)設計規范:
1)需建立對應的字典。
2)通過字典函數調用,不應通過JOIN表方式調用。
3)同一個代碼對應該多個屬性時,應合并到一個字典。
4)字典調用方式為dictGet('dict_name', attr_names, toUInt64(expr))
5)若代碼不為數字時,調用方式為dictGet('dict_name', attr_names, cityHash64(expr))
6)默認值為空字符串(非NULL)。
元數據
(1)數據表元數據
(2)字段元數據
(3)數據表關系
一組關系由兩個表的字段組成,為確保字段的唯一性,需要明確字段所有的數據庫、數據表。系統根據表關系自動生成關系圖譜。