微軟在最新版本的SQL Server中加入了Tabular Model,目的在於降低數據分析的門檻,使各個業務部門的人員通過簡單的IT培訓,制作出符合自己需要的分析模型。
由於其降低了操作門檻,所以各個部門的業務人員可以不用等IT部門的長時間響應就可以制作出簡單的分析模型。
本文根據微軟提供的官方示例以及教程,簡單介紹Tabular Model的建立過程,為了簡便省略了官方教程中部分內容,並加入了自己的理解和評論,這些內容只代表本人(哥本哈士奇,代號aspnetx,英文名Wade)的觀點,不代表微軟公司以及本人所在的公司的觀點。
一些跟文章不相關的內容:
年前年后一忙,體重雖然沒漲,但人真的變了憔悴好多,最近也剛剛把書本拿起來看。此篇分兩個時間點編寫,中間隔了一周多。作為新東西,接觸起來好困難,畢竟微軟設計它的定位就不一樣,不過還是硬着頭皮看了下來,也算是跟先前一個朋友的約定有個交代。
下面進入正文。
在進行實例的操作之,前需要檢查SSAS的Tabular Model是否有被安裝。需要注意的是,跟SQL Server 2012之前的版本不同,這個實例是單獨的一個分析服務實例,需要單獨安裝。
如圖,在SQL Server的分析服務安裝過程中,會多出來這樣一個分析服務類型的選擇界面,選擇第二個Tabular Mode就可以。如果你的機器中已經安裝過默認的分析服務實例,那么這個服務只能以新實例的方式存在。
安裝完成之后,就可以在服務列表中看到被安裝的服務。
比如圖中,我有兩個分析服務的實例,一個是默認的MSSQLSERVER,運行多維和數據挖掘模式,一個MSBI實例,運行Tabular Mode模式。兩個模式是不能存在於同一個分析服務實例當中的,只能放到不同的實例當中去。
確認好實例已經被安裝之后,打開SQL Server Data Tools。跟前幾個版本一樣,這個工具實際上還是Visual Studio 2010的一個shell。但是跟以前的版本不同,這個版本不再以VS命名了,而是直接Data Tools來命名。而且如果你在用Windows 8,那么在小塊塊中找到SSDT確實很費勁,比較好的方法是點下開始按鈕出現Metro界面后直接在鍵盤上敲data,在過濾出來的應用程序列表中,通常第一個就是。
打開SQLServer Data Tools之后,選擇File->New Project新建SSAS Tabular Model項目。
在VS Shell下可以看到新建項目下除了以往的SSAS項目之外又多了一個Analysis Services Tabular Project,就是這個。
然后會彈出一個窗體讓你選擇一個分析服務實例,這里要選擇安裝了Tabular Model的分析服務實例。Compatibility Level根據已經部署好的實例版本選擇就可以。
,
如果Compatibility Level和服務器的版本不匹配,會出現錯誤提示:
確認好之后,會看到解決方案管理器中的項目結構。
這個結構真的要比傳統的分析服務簡單好多,只有一個bim文件,不想傳統的多維模式一樣,會單獨把數據遠視圖,CUBE,維度等都單獨區分開。也許IT開發人員會覺得這樣就一個bim文件很別扭,但這個工具終究是定位給業務人員使用的,畢竟要遵從業務人員使用Excel和Access的大多數習慣。
雙擊打開項目中自動建立好的Model.bim文件,會看到VS Shell中的菜單中多出一個Model項,點擊它,選擇Import From Data Source…
然后會看到項目支持的數據源類型:
這里需要留意的是,根據Tabular Mode模式的不同,所支持的數據源類型也會不同。在In Memory模式下,相對支持的數據源要多一些。而在Direct Query中,只支持微軟自家的數據源。
這里選擇默認的Microsoft SQL Server,然后下一步。
這里選擇微軟官方的Data Warehouse for Adventure Works數據庫。這些示例的數據庫的下載和安裝方法請參考我先前關於如何獲取和安裝微軟SQL Server官方示例庫的文章,里面有詳細的介紹,你可以通過在本文下面的文章引用列表中找到。
然后會看到模擬信息對話框,由於這里是練習,為了實驗順利進行,所以敲一個本地的管理員身份賬號進去就可以了。當然實際的生產環境中建議為其配置單獨的賬戶來維護數據源的權限訪問信息。
輸入好之后點下一步。
這里會讓你指定如何導入數據,是通過選擇表或者視圖的方式還是通過查詢的方式。這里默認選擇第一個,點下一步。
之后會列出剛才指定數據庫下的所有表,這里我們只選擇其中的幾張表,並且為它們重新定義一個友好一點的名稱。
Source name |
Friendly Name |
DimCustomer |
Customer |
DimDate |
Date |
DimGeography |
Geography |
DimProduct |
Product |
DimProductCategory |
Product Category |
DimProductSubcategory |
Product Subcategory |
FactInternetSales |
Internet Sales |
選擇好需要用哪些表之后,因為一個表里不一定所有的字段都是分析時要用到的,所以還要再對表里的字段進行過濾。
首先過濾Customer表,選中這張表后,點擊Preview & Filter。
這里通過反勾選列上面的CheckBox過濾掉不需要的字段。在Customer中需要過濾掉的字段(注:是反選下列各表中提及的字段,以達到把相應列從表模型中剔除出去的目的):
Customer |
SpanishEducation |
FrenchEducation |
SpanishOccupation |
FrenchOccupation |
過濾完成后,可以看到已經被過濾的表已經打好了標記:
然后,再按照如下表中的定義,把相應的字段過濾掉。
Date |
DateKey |
SpanishDayNameOfWeek |
FrenchDayNameOfWeek |
SpanishMonthName |
FrenchMonthName |
DateTimeAlternateKey |
Geography |
SpanishCountryRegionName |
FrenchCountryRegionName |
IpAddressLocator |
Product |
SpanishProductName |
FrenchProductName |
FrenchDescription |
ChineseDescription |
ArabicDescription |
HebrewDescription |
ThaiDescription |
GermanDescription |
JapaneseDescription |
Product Category |
SpanishProductCategoryName |
FrenchProductCategoryName |
Product Subcategory |
SpanishProductSubcategoryName |
FrenchProductSubcategoryName |
Internet Sales |
OrderDateKey |
DueDateKey |
ShipDateKey |
過濾完畢后,點擊完成,結束數據的導入設置,之后開始導入數據。
導入完成后點擊Close,然后在VS Shell中看到被導入的數據。
然后,標識時間表。選擇導入的Date表,選擇菜單欄的Table項,Date下面的Mark As Date Table。
只有當一個時間維度的表被這樣標識過之后,一些基於時間的智能函數才會起作用。
接下來定義表之間的關系。
選擇菜單欄下的Model->Model View->Diagram View。
這里可以看到在Data Warehouse中定義的關系已經被自動導入了進來。這里只需要確認下就可以。
很多實際的項目當中,開發人員往往不願意使用外鍵來關系表里的數據,而是在傳統的多維模型項目中,靠維度用法來指定關系。如果是這種情況那么在這里,表間的關系是一定要指定的,否則系統將無法根據這些關系來"算"數據。
然后需要手動設置Internet Sales和Date之間的關系。在表Internet Sales中,Order Date, Due Date和Ship Date跟Date表中的FullDateAlternateKey關聯。設置的方法跟以往的工具一樣,比如,拖拽表Internet Sales的字段Order Date到表Date中FullDateAlternateKey字段就可以。
關系創建好之后,再繼續計算列的添加。計算列也可以叫派生列,也就是一個新的列,這個列的值是由其它數據計算而來的。
首先,切換回表格模式,選擇Model->Model View->Data View。
選擇Date表,可以看到表的最右邊有一個Add Column。
選中下面任意一行,然后在fx里輸入公式:
=RIGHT(" " & FORMAT([MonthNumberOfYear],"#0"), 2) & " - " & [EnglishMonthName]
值得一提的是,公式編輯區的智能感知功能很贊。還有,這里不是MDX表達式,而是DAX,跟Excel的公式很像。
公式輸入完成后,按回車,可以看到這一列右下角的更新進度條。
更新完畢后,可以看到根據公式計算好的數據,最后為其重新命名,右鍵新加的這一列,選擇Rename Column。
然后再為Product表創建度量。(此步不建議忽略,后面創建層次的時候要用到)
新列名:Product Subcategory Name
公式:=RELATED('Product Subcategory'[EnglishProductSubcategoryName])
新列名:Product Name
公式:=RELATED('Product Category'[EnglishProductCategoryName])
然后,為模型添加度量。
如上圖,在每個表界面中,分為上下兩個部分,上部分為導入的表,下部分為模型中包含的度量。
如果看不到下面的度量列表,可以點擊菜單中的Table->Show Measure Grid。
標注:如果你熟悉以前的多維模式,那么你可以理解為上面是數據源視圖,下面為Cube設計視圖。
在Tabular Mode模式添加度量的方法是單擊度量視圖左上角。然后在公式區域輸入公式:
=COUNTROWS( DATESQTD( 'Date'[FullDateAlternateKey]))
待度量更新后,可以看到系統自動為這個度量起了個名字:
然后將這個度量重新命名,方法是在公式區域直接選中Measure 1然后將其修改成想要的名字即可。這里將其修改成:
Days Current Quarter to Date
也可以在公式區域中輸入完整的格式,也就是度量值名稱+公式的格式,比如再建立一個度量值,公式區域中直接輸入:
Days in Current Quarter:=COUNTROWS( DATESBETWEEN( 'Date'[FullDateAlternateKey], STARTOFQUARTER( LASTDATE('Date'[FullDateAlternateKey])), ENDOFQUARTER('Date'[FullDateAlternateKey])))
可以看到名稱為Days in Current Quarter的度量已經被建立。
最后,在事實表Internet Sales表中添加度量。相對前面的方法直接敲公式,這里的方法相對更簡單一些。
切換到Internet Sales表,選中列SalesOrderNumber,然后單擊工具欄中的公式圖標。
然后就可以看到一個以Distinct Count匯總方式計算的度量。
至此,一個基於事實表的度量值列添加完成。
接下來繼續添加維度層次關系。這里創建一個產品分類的層次結構,其中根據數據包含產品的一級分類和二級分類。
切換到Diagram模式,右鍵Product表,點擊Create Hierarchy。
可以看到在表的下面一個層次關系已經被建立。
右鍵單擊新建的層次,選擇Rename將其重命名為Category。
在表中找到Product Category Name和Product Subcategory Name兩列,依次拖拽到層次Category下。(注,這兩列是先前在Product表里創建的)
然后,將Category下的兩個層次分別命名成Category和SubCategory。
至此,Product的層次創建完成。
再演示下給Date表加一個時間層次。這個層次將包含從年到月再到天的時間導航。(根據需要你也可以加入半年合季度等層次)
首先還是根據前面的方法一樣,右鍵Date表選擇Create Hierarchy,創建好一個層次后再將其重命名為Calendar,然后將表中的CalendarYear,MonthNumberOfYear和DayNumberOfMonth一次拖拽到層次下。
然后再將這三個層次分別命名為Year, Month和Day。
這樣,一個Calendar層次結構創建完成,此外,還可以根據這個表創建財務日期層次等多個層次。具體方法參考Calendar的創建即可。
到這里,這個Tabular Mode的分析模型創建好了,可以在Excel里查看下這個分析模型。
方法是在工具欄中點擊Analyze in Excel。
然后彈出對話框讓你指定用哪個用戶來瀏覽數據。
根據本篇的內容這里直接選擇OK就可以。
每次出現這個界面可能很煩,但在實際開發中它還是很方便的,因為我們配置好權限后,通過這里可以很好的去驗證下配置的權限是否生效。
點擊OK后,熟悉的Excel界面被打開。
可以看懂啊這就是一個透視表。從這里也可以看到,Tabular Mode最終暴露給的用戶接口實際上和傳統的多維模式一樣,只不過底層的數據存儲方案不一樣。相對中小規模的數據來說,Tabular Mode的In Memory緩存更有優勢,而對於比較大比較復雜的業務分析來說用傳統的多維方式更具有優勢。當然,我們更願意看到未來的版本中,會出現兩個方案的"中間方案"結合兩邊的優點。
透視表對於業務部門來說是最熟悉不過的工具,如何 操作屬於Excel部分的內容,這里不再做具體的講解。
到這里,一個簡單的基於Tabular Mode的分析模型構建完成了。
總結:
整個操作過程下來,根絕Tabular Mode項目的操作模式跟傳統的多維模式區別很大,有些地方甚至很難去適應,想找的東西往往需要很久才可以找的到,甚至根本找不到,比如在線打開一個Tabular Mode。不過微軟這樣設計也並不是沒有道理,傳統的多維模型定位是給IT人員的,我們已經適應了那種模式,而Tabular Mode是定位給業務部門來操作的,確實很多操作都跟Excel和Access很像。所以有這樣的區別也是可以理解的。
另外有一點需要注意的是,Tabular Mode中的查詢語言用的是DAX而不是傳統的MDX,DAX的寫法也許更像Excel,相對來說對於業務部門的人員來說更容易讀懂。
總之,Tabular Model的提出降低了分析模型的開發難度,使具有基本IT技能的各個業務部門可以根據已有的數據倉庫開發出符合自己需要的簡單數據分析模型,而無需每次向IT提需求然后等待長時間的響應之后才可以繼續工作。另外它的內存緩存模式確實也很具有吸引力,簡單的數據分析模型可以在上面得到快速的響應。
但在一定意義上來說,Tabular Model不會取代傳統的多維分析模型,更不會替代整個BI的架構。首先它是分析服務,在整個BI框架中它只是其中的一層,底層的數據倉庫還需要做很多的ETL工作。而它對於傳統的多維模型,由於彼此的數據存儲形式不同,所以它們還是會長時間的對立存在,表模式的更適合業務人員來操作,多維模型更適合復雜結構並且有IT部門來完成的情況,更何況后者還有數據挖掘的部分。未來即使有整合,我個人預測也是在多位模型中加入In Memory Cache的功能,其它不會有太大的改變。