介紹資料分層的作用
提出一種通用的資料分層設計,以及分層設計的原則
舉出具體的例子說明
提出可落地的實踐意見
0x01 資料分層?
「為什麼要設計資料分層?」
這應該是資料倉儲同學在設計資料分層時首先要被挑戰的問題,類似的問題可能會有很多,比如說「為什麼要做資料倉儲?」、「為什麼要做元資料管理?」、「為什麼要做資料質量管理?」。當然,這裡我們只聊一下為什麼要做設計資料分層。
作為一名資料的規劃者,我們肯定希望自己的資料能夠有秩序地流轉,資料的整個生命週期能夠清晰明確被設計者和使用者感知到。直觀來講就是如下的左圖這般層次清晰、依賴關係直觀。
但是,大多數情況下,我們完成的資料體系卻是依賴複雜、層級混亂的。如下的右圖,在不知不覺的情況下,我們可能會做出一套表依賴結構混亂,甚至出現迴圈依賴的資料體系。
因此,我們需要一套行之有效的資料組織和管理方法來讓我們的資料體系更有序,這就是談到的資料分層。資料分層並不能解決所有的資料問題,但是,資料分層卻可以給我們帶來如下的好處:
清晰資料結構:每乙個資料分層都有它的作用域和職責,在使用表的時候能更方便地定位和理解
減少重複開發:規範資料分層,開發一些通用的中間層資料,能夠減少極大的重複計算
統一資料口徑:通過資料分層,提供統一的資料出口,統一對外輸出的資料口徑
複雜問題簡單化:將乙個複雜的任務分解成多個步驟來完成,每一層解決特定的問題
一、資料運營層:ods(operational data store)
「面向主題的」資料運營層,也叫ods層,是最接近資料來源中資料的一層,資料來源中的資料,經過抽取、洗淨、傳輸,也就說傳說中的 etl 之後,裝入本層。本層的資料,總體上大多是按照源頭業務系統的分類方式而分類的。
一般來講,為了考慮後續可能需要追溯資料問題,因此對於這一層就不建議做過多的資料清洗工作,原封不動地接入原始資料即可,至於資料的去噪、去重、異常值處理等過程可以放在後面的dwd層來做。
二、資料倉儲層:dw(data warehouse)
資料倉儲層是我們在做資料倉儲時要核心設計的一層,在這裡,從 ods 層中獲得的資料按照主題建立各種資料模型。dw層又細分為 dwd(data warehouse detail)層、dwm(data warehouse middle)層和dws(data warehouse servce)層。
資料明細層:dwd(data warehouse detail)
該層一般保持和ods層一樣的資料粒度,並且提供一定的資料質量保證。同時,為了提高資料明細層的易用性,該層會採用一些維度退化手法,將維度退化至事實表中,減少事實表和維表的關聯。
另外,在該層也會做一部分的資料聚合,將相同主題的資料匯集到一張表中,提高資料的可用性,後文會舉例說明。
資料中間層:dwm(data warehouse middle)
該層會在dwd層的資料基礎上,對資料做輕度的聚合操作,生成一系列的中間表,提公升公共指標的復用性,減少重複加工。
直觀來講,就是對通用的核心維度進行聚合操作,算出相應的統計指標。
資料服務層:dws(data warehouse servce)
又稱資料集市或寬表。按照業務劃分,如流量、訂單、使用者等,生成字段比較多的寬表,用於提供後續的業務查詢,olap分析,資料分發等。
一般來講,該層的資料表會相對比較少,一張表會涵蓋比較多的業務內容,由於其字段較多,因此一般也會稱該層的表為寬表。
在實際計算中,如果直接從dwd或者ods計算出寬表的統計指標,會存在計算量太大並且維度太少的問題,因此一般的做法是,在dwm層先計算出多個小的中間表,然後再拼接成一張dws的寬表。由於寬和窄的界限不易界定,也可以去掉dwm這一層,只留dws層,將所有的資料在放在dws亦可。
四、維表層(dimension)
最後補充乙個維表層,維表層主要包含兩部分資料:
高基數維度資料:一般是使用者資料表、商品資料表類似的資料表。資料量可能是千萬級或者上億級別。
低基數維度資料:一般是配置表,比如列舉值對應的中文含義,或者日期維表。資料量可能是個位數或者幾千幾萬。
至此,我們講完了資料分層設計中每一層的含義,這裡做乙個總結便於理解,如下圖。
0x03 舉個栗子
趁熱打鐵,舉個栗子說明一下,如下圖,可以認為是乙個電商**的資料體系設計。我們暫且只關注使用者訪問日誌這一部分資料。
在ods層中,由於各端的開發團隊不同或者各種其它問題,使用者的訪問日誌被分成了好幾張表上報到了我們的ods層。
在dwm層,我們會從dwd層中選取業務關注的核心維度來做聚合操作,比如只保留人、商品、裝置和頁面區域維度。類似的,我們這樣做了很多個dwm的中間表
然後在dws層,我們將乙個人在整個**中的行為資料放到一張表中,這就是我們的寬表了,有了這張表,就可以快速滿足大部分的通用型業務需求了。
0x04 技術實踐
既然談到了資料分層,那不同的層次中會用到什麼計算引擎和儲存系統呢,本節來簡單分享一下。
資料層的儲存一般如下:
ods 層:ods 的資料量一般非常大,所以大多數公司會選擇存在hdfs上,即hive或者hbase,hive居多。
0x05 思考
如同《漫談資料倉儲和正規化》一文在最後思考資料倉儲和正規化之間的關係一樣,本文也將思考和總結一下資料分層的原則是什麼?為什麼要這樣分層?每層之間的界限又是什麼?
我個人從這幾個角度來理解資料分層的劃分:
從能力範圍來講,我們希望80%需求由20%的表來支援。直接點講,就是大部分(80%以上)的需求,都用dws的表來支援就行,dws支援不了的,就用dwm和dwd的表來支援,這些都支援不了的極少一部分資料需要從原始日誌中撈取。結合第一點來講的話就是:80%的需求,我們都希望以對應用很友好的方式來支援,而不是直接暴露給應用方原始日誌。
從資料聚合程度來講,我們希望,越上層資料的聚合程度越高,看上面的例子即可,ods和dwd的資料基本是原始日誌的粒度,不做任何聚合操作,dwm做了輕度的聚合操作只保留了通用的維度,dws做了更高的聚合操作,可能只保留一到兩個能表徵當前描述主體的維度。從這個角度來看,我們又可以理解為我們是按照資料的聚合程度來劃分資料層次的。
數倉分層總結
數倉分層 ods層 1 保持教據原貌不做任何修改,備份 2 建立分割槽表,防止後續的全表掃瞄 3 採用lzo壓縮,並建立索引 切片 4 建立外部表 多人共用 內部表 自己使用的臨時表 dwd層 1 數倉維度建模 星型模型 維度退化 商品表 品類表 spu表 分類 二級分類 一級分類 商品表 省份 地...
數倉分層概念
把複雜問題簡單化 將乙個複雜的任務分解成多個步驟來完成,每一層只處理單一的步驟,比較簡單和容易理解。清晰資料結構 每乙個資料分層都有它的作用域,這樣我們在使用表的時候能更方便地定位和理解。便於維護資料的準確性,當資料出現問題之後,可以不用修復所有的資料,只需要從有問題的步驟開始修復。減少重複開發 規...
數倉的分層
一 數倉為什麼要分層?1 分層解耦,可以讓開發思路更加清晰,複雜問題簡單化 出錯時,可以精確定位資料 2 節省重複開發 3 脫敏 二 數倉的分層 以5層數倉為例 ods層 原始資料層,原始資料原封不動的直接匯入!dwd層 基於ods層,將原始資料進行清洗,篩選後的資料,把其中的明細開啟 例如 啟動日...