1. 背景
筆者正在開發(fā)大數據平臺(XSailboat)中的指標建模工具(SailIMS)。以此篇文檔梳理一下其中一部分關鍵性的功能設計。內容重點不在解釋各種理論和方法,而是描述一種將實際落地、可操作的指標建模功能設計方案。
2. 基礎概念
下面這些概念是基于筆者自己的理解和產品設計需要闡述的,并非標準。在軟件工程中沒有絕對的標準和范例,關鍵與自己的業(yè)務場景相適應。阿里云的DataWorks中亦有他們的概念和設計,可以參考《阿里云數據指標概述 》。

這個圖能很好地闡述一些指標的核心概念。包括原子指標、維度、派生指標。
在維度中,時間維度是一個非常重要和特殊的維度。時間維度確立了數據在時間尺度上的分組方法。在通常情況下,一個維度一般對應著一個字段,但基于我所使用的統(tǒng)計技術和經驗,我將時間維度定義為由以下5個字段組成的元組。
- time_range_type,統(tǒng)計期范圍類型??扇≈涤校耗甓取⒓径?、月度、每周、每天等??梢园葱钄U展更多統(tǒng)計期范圍類型。
- start_time,統(tǒng)計期開始時間。例如當統(tǒng)計期為年度時,2023年度的start_time就是2023-01-01 00:00:00
- end_time,統(tǒng)計期結束時間。例如當統(tǒng)計期為年度時,2023年度的end_time就是2024-01-01 00:00:00,
- sts_start_time,事實上的統(tǒng)計開始時間。例如當統(tǒng)計期為年度時,2023年度的sts_start_time就是2023-01-01 00:00:00
- sts_end_time,事實上的統(tǒng)計結束時間。例如當統(tǒng)計期為年度時,假設當前是2023年7月15號,那么它的sts_end_time就是2023-07-15 00:00:00。因為這通常是離線統(tǒng)計,業(yè)務日期為昨天,2023-07-14。而sts_end_time是右開,不包含的,所以是2023-07-15 00:00:00。
上圖中,沒有包含復合指標。它是由其它指標符合而成的指標??梢杂孟聢D解釋

復合指標可以有一個或多個指標復合而成,復合指標可以用圖中的表連接語句來類比。因為復合指標復合方式邏輯可能比較復雜,可能是一個指標表內部一行數據多個指標列之間的運算(多個維度相同來源于同一個統(tǒng)計基礎寬表的多個指標一般會在同一個表中),也可能是某列行間的運算,也可能是多個表連接之后同一行多列之間的運算。這幾種情形,其實都可以類比成圖中的表連接SQL。
??在非指標定義直接生成計算任務的情況下,為了降低定義者的描述負擔,復合指標一般用語言描述出它的計算方法即可,無需用嚴格的關系代數去描述。但是其相關指標來源、維度來源依然需要結構化配置。
3. 指標管理功能設計
指標的核心概念理清以后,接下來面臨的一個問題是,指標該如何組織管理,如何支撐起指標的配置??。?/p>
我這邊支撐起這些的關鍵概念及組件是:
- 維度建模
- 業(yè)務類/包/域
- 指標視圖
3.1 概念及思想
業(yè)務域。筆者所開發(fā)的大數據平臺是面向政府和大企業(yè)的私有大數據平臺。對于一個地方政府或一個大企業(yè)來說,它有很多個業(yè)務方向,在進行指標創(chuàng)建的時候,需要按領域去構建,但是在查看/使用的時候,即在構建指標視圖的時候,應該可以垮業(yè)務域組織視圖。所以在指標這塊沒有像數據工廠一樣采用工作空間來做嚴格資源和空間劃分,而是使用了業(yè)務域的概念,這樣既能對通過業(yè)務域對資源進行必要的訪問控制,又能讓某些人可以一次查看多個業(yè)務域去構建視圖。
業(yè)務包。在業(yè)務域下面由業(yè)務包來分層組織管理業(yè)務類。
業(yè)務類。是具有指標描述價值的一類事物名詞。例如,國家、省份、企業(yè)、人等一類事物名詞。例如:
- “一個國家的人的平均身高”這個指標,它就可以作為“國家”這一業(yè)務類的指標。
- “一個省份的年度GDP”指標就可以作為“省份”這個業(yè)務類的指標。
- “一個企業(yè)的年度營收”指標就可以作為“企業(yè)”這個業(yè)務類的指標。
- “一個人的身高”這個指標就可以作為“人”這個業(yè)務類的指標。
業(yè)務類來源于維度,是在維度上的進一步擴展。這種擴展在實現上不是垂直方向上的繼承擴展(繼承維度類),而是通過關聯(lián)水平擴展。業(yè)務類必需設定一個主維度,設定0..n個維度作為修飾維度。
業(yè)務類下面的指標必需引用當前業(yè)務類的主維度,其它修飾維度可以引用,也可以不引用。
業(yè)務類之間可以有繼承關系。繼承關系是在父類的基礎上,通過限定父類上沒有限定的維度取值的方法,得到子類。例如,“人”關聯(lián)有id(人的唯一標識)、年齡段(可取值:兒童、青年、壯年、老年)、性別(可取值:男、女)三個維度,那么“人”就可以通過限定性別為男,得到“男人”這個業(yè)務類,通過限定性別為女,得到“女人”這個業(yè)務類。這個過程與指標派生的過程類似,其實這個業(yè)務類就是通過維度分類管理指標的構件。特別的是,它是選取有指標評價的目標事物作為主線,再疊加修飾限定去構建更細化的事物,就像前面的例子,我們以“人”作為主線,疊加修飾“雄性”、“雌性”,得到“男人”、“女人”業(yè)務類。
子類缺省具有父類上所掛接的所有指標,支持主動排除某些缺省繼承下來的指標。
一個指標有多個維度,如果其中有兩個或兩個以上的維度是業(yè)務類的維度屬性時,它將自動出現在其它業(yè)務類下面。即某個業(yè)務類下面有哪些指標,是通過業(yè)務類的維度屬性,尋找使用此維度的所有指標。
注:這個地方之所以用業(yè)務類,而不用業(yè)務對象,是因為在實踐中,看到業(yè)務對象,特別讓人潛意識的認為它是一個實體對象。例如:張三、山東省等,所以選擇使用業(yè)務類。業(yè)務類是可以通過限定維度,細化到實體對象級別的。
指標視圖。業(yè)務域、包、和業(yè)務類是從指標構建角度設定的層次結構,但從指標用戶的角度,它可能需要有專門的、個性化的視角去組織、審視指標。所以指標建模模塊提供了指標視圖功能,支持按人、按角色去構建個性化視圖。指標視圖是可以跨業(yè)務域構建的。
維度建模,是以業(yè)務域作為限定空間的。同一業(yè)務域內不能有同名維度,不同業(yè)務域可以有同名維度。維度建模作為一個單獨的功能塊,是為了實現維度被指標共享,避免重復定義。

3.2 指標與數據
在定義了指標之后,如果指標不能跟數據關聯(lián)起來,那么指標就定義就缺少了靈魂,缺少定義和維護迭代的動力。
我們的數據工廠是用Hive作為離線分析的計算和存儲引擎、用Flink作為實時計算引擎,他們的計算結果最后都會輸出到關系數據庫,再由數據服務配置生成API,發(fā)布到API網關。因此我選擇在指標建模工具中,將指標和API網關上的API進行單向綁定,從而建立起指標和數據的關聯(lián)。
這樣點擊指標不僅能查看指標的定義,也能查看指標數據。支持以表格和通用圖表的形式展示指標數據。
能和指標綁定的API是由形式要求的。要求有:
- Http Method為GET
- 只有Query形式的參數;
- 查詢參數名和指標的維度名要一一對應。(維度有名稱和顯示名。名稱是復合數據庫字段命名規(guī)范的)
- 返回結果必需是這種形式的JSON數據。
{
"data":{
[v00 , v01 , ... , v0n] ,
[v10 , v11 , ... , v1n] ,
...
[vm0 , vm1 , ... , vmn]
} ,
"meta" : {
"col0":{
"dataType":"string" ,
"colIndex":0 ,
...
} ,
....
}
}
指標和數據相關的系統(tǒng)邏輯結構如下圖所示

3.3 指標建模在大數據平臺中的定位
指標建模功能對于大數據平臺的意義主要體現在下面幾個方面:
- 是進行數據開發(fā)之前,討論確定需求,梳理指標的重要工具,它是數據開發(fā)的終極目標,像燈塔一樣指引、規(guī)范整個開發(fā)過程。
- 它也是數據開發(fā)之后,有效的任務完成情況核查工具。初略的核查,只要看看前期定義的指標是否都綁定了API,看看其可視化圖表就可以。
- 用它可以構建出數據開發(fā)結果的知識體系。對于非數據和API開發(fā)者,相對于數據表和API而言,對于指標應該更為了解,從指標切入去尋找API和數據表將更為容易。指標建模成為他們了解數據的一個切入點。

這是自己的大數據平臺(XSailboat)的指標建模和數倉建設的思路,在開發(fā)過程中就建立起“指標?模式?數據?接口?圖表”的雙向聯(lián)系,從其中任何一個點切入,都能有線索獲取到其它部分的相關信息。