本文將模擬一個數據倉庫系統,其中有用戶數據,產品數據以及訂單數據。根據這些數據結構建立多維數據集,並且以增量更新的方式對其進行處理。
之所以強調增量的方式,是考慮到事實表中數據的增長,假設以後增長到幾十億,全量處理就變得很不現實,所以方案中着重演示以增量方式處理多維數據集的方案。
增量處理多維數據集的關鍵是要將事實數據分爲兩部分處理,一個是增量事實表,一個是歷史事實表,多維數據集第一次處理歷史事實表中的數據,以後每次週期性的處理都是處理增量表中的數據。
本文中提及的SQLServer和Visual Studio都是2008版本,2005版本同樣也適用。
數據假設:一張用戶表,一張產品表,一張訂單表,訂單裏記錄的是誰買了什麼。多維數據集統計的需求就是根據訂單統計誰買過什麼。
首先,建立數據倉庫,在數據引擎下新建BIDemo庫。
接下來建立用戶表,結構如下:
此外還有產品表:
以及歷史訂單表和建立增量訂單表,它們的結構是一樣的:
爲了測試方便,我們在用戶表中加入一些測試數據:
然後在產品表中加入一些測試數據
至於事實表,手動加入測試數據就不現實了,所以這裏寫了一個程序利用隨機數來灌測試數據:
這個程序的代碼可以在本文中找到。生成後的數據基本如下所示:
到此,測試的數據結構以及數據就已經準備好了,相當於有了一個小型的數據倉庫。
接下來在Visual Studio中建立BI解決方案,方案下分爲一個SSIS項目和一個SSAS項目。
在SSAS項目下建立數據源和數據源視圖,這裏需要注意的是,事實表用歷史表,而不是增量表,儘管其還沒有數據。
首先建立數據源,連接剛纔建立的數據庫,並且在數據源視圖裏定義好關係,如下圖:
然後,根據此數據源視圖建立多維數據集,需要注意的是,度量選擇歷史表,維度選擇用戶和產品兩個表。
最後,部署多維數據集。這裏只部署就可以了,不需要處理,處理任務將在以後的SSIS包中處理。
下面來看SSIS項目。在SSIS包裏建立四個任務模塊,類型分別如下:
前兩個多維數據集處理模塊是用來處理多維數據集的,數據流負責把增量事實表的數據導到歷史事實表中,最後執行一個SQL任務把增量表中的數據刪除。
兩個多維數據集模塊,前一個是專門處理維度,第二個是處理cube。這裏之所以要把多維數據集維度處理單獨拿出來放在前面,是因爲在筆者經驗中,對多維數據集的處理雖然是全部處理,但是新增維度的數據不會被聚合到其中,所以需要單獨拿出來放在前面處理。
(題外話:對於這個地方筆者一直也不是很理解,按理說既然是全部處理那麼怎麼連維度都不處理呢,還需要單拿出來)
以下是設置維度處理模塊,在界面中選擇維度即可。
然後是cube處理模塊,如下圖。
然後指定增量更新,並且配置增量更新的數據表,這裏指定增量表。
多維數據集處理完成之後就可以把增量表的數據放到歷史表中了,以保證第二天加入的數據都是增量數據。
需要注意的是,在實際的運行當中,一定要保證BI的處理過程時業務系統沒有發生數據,否則就會造成數據遺漏而導致不平。所以,BI的處理一般都是在凌晨。
然後是第三步的數據流模塊,此部分的主要任務是將增量表的數據轉移到歷史表中。
最後的一個SQL任務是一個Delete或者Truncate table任務,把增量表裏的數據清空。
最終的任務流程如下圖:
執行包,全部成功之後應該如下圖所示:
執行成功後,打開歷史表,可以發現數據已經在裏面了,而且增量表中的數據已經不存在了。
查詢多維數據集,可以看到新的數據被聚合到其中。
通過以上透視表可以清晰的看到誰買了什麼樣的產品。
再次運行Rubbish往增量表裏灌幾條數據,然後重新運行此SSIS包,可以發現新增的數據已經被聚合到多維數據集中了,注意處理的方式是增量的。
本文提及的數據結構模型都很簡單,主要介紹的是多維數據集處理的流程以及方法,重點闡述增量部分的方案,以及需要注意的問題。希望有知道更好方法的兄弟一起交流探討。
FAQ:
1.增量數據是怎麼來的?
筆者個人認爲這個需要跟業務系統配合來做,比如加入觸發器等。或者通過時間戳,到業務系統中能提取到。
2.如果有更新和刪除怎麼辦?
通常是在本文提到的方案之上,再加一個度量值位,標識爲1,代表新增。對於刪除的記錄,實際上是加入了一個同樣的記錄,並且表示爲爲-1。更新則是加入了兩條記錄,一條記錄爲-1跟刪除差不多,一條就爲1代表修改後的記錄,三個一樣的記錄靠時間戳來標記哪一個是修改後的記錄。主要就是以這個標識位作爲度量進行統計。