1. 程式人生 > 實用技巧 >指標管理系統設計

指標管理系統設計

什麼是指標

資料團隊出具的一個統計報表欄位即為指標。比如最近七天的訂單量,一個促銷活動的購買轉化率等等。
一個指標具體到計算實施,主要有以下幾部分組成

  • 指標加工邏輯,比如count ,sum, avg
  • 維度 比如按部門、地域進行指標統計,對應sql中的group by
  • 業務限定/修飾詞 比如以不同的支付渠道來算對應的指標,微信支付的訂單退款率,支付寶支付的訂單退款率 。對應sql中的where

除此之外,指標本身還可以衍生、派生出更多的指標,基於這些特點,可以將指標進行分類

  • 原子指標 基本業務事實,沒有業務限定、沒有維度。比如訂單表中的訂單量、訂單總金額都算原子指標
  • 派生指標 比如過去5天的訂單總金額,就是加了業務時間限定
  • 衍生指標 比如某一個促銷活動的轉化率,就需要促銷投放人數指標促銷訂單數指標進行計算得出

指標系統建設前的狀況

  • 不知道口徑,資料平臺出去的指標,使用者甚至資料研發自己都不知道具體的口徑,需要翻程式碼
  • 指標耦合,不方便下線和口徑調整,現有報表都是需求驅動,一個sql中可能對應了多個指標的計算,導致指標下線,邏輯調整都要相互影響
  • 指標重複計算,不同報表用到同一個指標,需要重複的寫同樣的邏輯,加重叢集的計算壓力,且指標口徑一調整,需要多處調整
  • 指標血緣無法跟蹤,資料團隊交付的報表時間久了不知道誰提的,不知道用到了哪些表,不知道最終被用到了哪些團隊
  • 只見樹木,不見森林。資料團隊花了大量時間在報表開發上,而忽略了底層模型的打磨

指標建設的巨集觀步驟

基於業務目的梳理指標體系

基於公司不同的業務模組,業務場景,不同的管理層級來梳理指標體系,敲定指標口徑。

  • 總經辦關注的流水相關指標,對應高層管理
  • 訂單小組關注的訂單履約相關的指標,對應業務模組
  • 廣告投放關注的轉化相關的指標,對應業務場景

基於系統支撐錄入和管理

通過系統建設,支撐上述梳理的指標體系,實現指標定義錄入,指標呼叫鏈查詢跟蹤,指標下線管理等功能

指標管理所在的數倉位置

指標的計算一般是在數倉星型模型之上

指標管理系統產品模組設計

指標定義

分為產品配置部分和技術人員配置部分
產品配配置

  • 選擇指標分類,屬於哪個業務模組
  • 指標需求描述,填寫指標發起的部門原由
  • 指標文字定義,填寫指標口徑的文字描述
    技術配置
    將原子指標和派生指標都定義為基礎指標,因為他們通過單一數倉模型即可計算出
    將衍生指標定義為複合指標,因為這類指標需要依據上述基礎指標做加工計算

基礎指標

  • 需要選擇業務事實表,維度表,以及業務事實同維度的關聯關係,相當於選定from的表和對應的group by邏輯
  • 編寫指標加工邏輯,比如count、sum、avg等
  • 編寫限定條件,相當於寫where條件

複合指標

  • 選擇基礎指標,比如選擇促銷投放人群數成單使用者數
  • 編寫加工邏輯,成單使用者數/促銷投放人數

指標查詢

基於指標中文名,搜尋對應的指標定義和血緣

指標下線

基於血緣統計,發現未被使用的指標,將其下線

對外介面

提供給外部系統,比如BI,用於查詢指標定義,這指標的詳細資料

指標許可權

控制不同使用者,不同應用能夠獲取到的不同指標範圍

報表配置化

基於指標系統中的指標池,以拖拽的方式,快速生產報表

指標管理系統技術實現

指標加工邏輯

基於指標定義中技術部分的定義,自動生成指標加工sql,並將其自動部署到排程系統中。自動生成的邏輯,無非是將指標定義中的字表加工邏輯、維度資訊、業務限定等組裝起來

指標輸出設計

sql加工好的指標,有如下兩種存放方式

在dws中以大寬表的形式存放

比如以使用者維度,組織大寬表,其中存放使用者相關的所有指標,比如使用者最近5天購買的訂單數,使用者最近30天的訂單金額等

缺點是:

  1. 報表組合不夠靈活,某些報表需要的指標跨多個大寬表,還得從多個dws大寬表中取資料
  2. 新增指標不夠靈活,新增一個指標需要在大寬表中加欄位
  3. 由於每個指標都是獨立的job,其計算完成的先後順序不一,需要做一些中間儲存,最後合併成大寬表

以統一的指標表存放所有的指標定義

對於T+1的指標,統一存放到一個指標表中,統一指標表的定義如下

指標id 指標code 指標value 日期分割槽

所有的指標job計算完後,都以上述格式將指標資料插入到對應的表中,一個job一次插入,會造成該表的小檔案問題。解決辦法是,可以在所有的指標計算完成後,統一對當天的指標分割槽做一次小檔案合併,合併sql類似

insert overwrite table chenjun_test PARTITION(dt='20200821') SELECT t.foo,t.bar from chenjun_test t where t.dt = '20200821'; 

整體腦圖

參考資料

https://tech.meituan.com/2020/03/12/delivery-data-governance.html
https://www.infoq.cn/article/K29hNd0osXPjCNLpJ2Wv
https://tech.meituan.com/2018/12/27/onedata-origin.html
https://mp.weixin.qq.com/s/-pLpLD_HMiasyyRxo5oTRQ
https://tech.meituan.com/2018/12/27/onedata-origin.html
http://baijiahao.baidu.com/s?id=1635554170455593452
https://help.aliyun.com/document_detail/112668.html?spm=a2c4g.11186623.6.756.33371e79CY1B2s
https://www.shangyexinzhi.com/article/1584086.html