假如你有一個購物類的網站,那麼你如何給你的客戶來推薦產品呢?這個功能在很多電商類網站都有,那麼,通過SQL Server Analysis Services的資料採礦功能,你也可以輕鬆的來構建類似的功能。
上一篇中介紹的是如何通過DMX來建立採礦模型,這一篇講簡單介紹如何通過編程的方式來建立採礦模型。
通過編程的方式主要通過AMO來實現,分析服務的所有跟架構相關的實現,包括Cube和資料採礦,都通過這個介面實現。
AMO對象樹包含了支援Cube和資料採礦所有的物件模型,在我這篇隨筆中可以詳細看到它的結構。
對象的結構稍微複雜一些,但我們關注的有三個部分:
通過這兩個對象串連到分析服務資料庫並且操作分析服務資料庫執行個體。
然後通過DataSource以及DataSourceView建立資料來源串連和資料來源檢視。
然後通過MiningStructrue下的對象體系和MiningModel來建立採礦結構和採礦模型,可以留意到Column是自包含的結構,這主要是考慮到了採礦結構中的嵌套模型。
通過以上的物件模型我們可以觀察到,這些對象跟我們在Visual Studio中建立一個資料採礦項目都是相對應的,在一個正常的過程中我們都會按照下面的套路進行操作:
- 建立項目(實際上部署之後對應的就是一個資料庫)
- 建立資料來源
- 建立資料來源檢視
- 建立採礦結構(定義資料結構)
- 建立採礦模型(挖掘演算法等)
以下將簡單示範如何通過AMO來建立資料採礦項目。
開啟Visual Studio,此篇用到的版本是2010,對應的資料庫是SQL Server 2012。在Visual Studio中建立一個控制台項目,然後按右鍵References檔案夾,選擇Add Reference…
點擊Browse找到AMO對象所對應的dll檔案。
這個檔案通常在如下的位置:
C:\Program Files (x86)\Microsoft SQL Server\110\SDK\Assemblies
接下來回到控制台代碼中,首先需要加入AMO對象的引用。
using Microsoft.AnalysisServices;
然後,通過如下的代碼串連到分析服務執行個體。
Server SSASServer = new Server();
SSASServer.Connect(@".");
建立分析服務資料庫。
#region Create database
string strDataBaseName = "DMAMO";
Console.WriteLine("Check database: " + strDataBaseName);
if (SSASServer.Databases.Contains(strDataBaseName))
{
SSASServer.Databases.Remove(strDataBaseName);
Console.WriteLine("Database " + strDataBaseName + " already exists, droped.");
}
Database db = new Database(strDataBaseName, strDataBaseName);
SSASServer.Databases.Add(db);
db.Update();
#endregion
上面代碼運行完畢後,會看到在對應的分析服務執行個體下已經建立了一個空的資料庫。
建立資料來源。
#region DataSource
RelationalDataSource rds = new RelationalDataSource("DMDataSource", Utils.GetSyntacticallyValidID("DMDataSource", typeof(Database)));
rds.ConnectionString = @"Data Source=.;Initial Catalog=AdventureWorksDW2012;Provider=SQLNCLI11.1;Integrated Security=SSPI;Application Name=SSASDEMO;";
rds.ImpersonationInfo = new ImpersonationInfo("wade", "iamfromcnblogs");
db.DataSources.Add(rds);
db.Update(UpdateOptions.ExpandFull);
#endregion
留意到資料來源對象的ImpersonationInfo屬性,它的設定對應如的設定。在本機開發的時候,為了方便我們通常將其設定成為一個管理員帳號。
建立資料來源檢視。
#region Data Source View
DataSet dset = new DataSet();
SqlConnection sqlconn = new SqlConnection(@"Data Source=.;Initial Catalog=AdventureWorksDW2012;Integrated Security=SSPI;Application Name=SSASDEMO;");
//Line Items
SqlDataAdapter daLineItems = new SqlDataAdapter("SELECT [OrderNumber],[LineNumber],[Model] FROM [vAssocSeqLineItems]", sqlconn);
daLineItems.FillSchema(dset, SchemaType.Mapped, "vAssocSeqLineItems");
dset.Tables["vAssocSeqLineItems"].ExtendedProperties.Add("TableType", "View");
//Orders
SqlDataAdapter daOrders = new SqlDataAdapter("SELECT [OrderNumber],[CustomerKey],[Region],[IncomeGroup] FROM [vAssocSeqOrders]", sqlconn);
daOrders.FillSchema(dset, SchemaType.Mapped, "vAssocSeqOrders");
dset.Tables["vAssocSeqOrders"].ExtendedProperties.Add("TableType", "View");
//Relationship
DataRelation relateProductSubCate = new DataRelation("Rel", dset.Tables["vAssocSeqOrders"].Columns["OrderNumber"], dset.Tables["vAssocSeqLineItems"].Columns["OrderNumber"]);
dset.Relations.Add(relateProductSubCate);
DataSourceView dsv = new DataSourceView("DMDSV", "DMDSV");
dsv.DataSourceID = "DMDataSource";
dsv.Schema = dset.Clone();
db.DataSourceViews.Add(dsv);
db.Update(UpdateOptions.ExpandFull);
#endregion
建立資料來源檢視是一個比較複雜的過程,表需要對應一個一個的對象,而且關係也要一一建立,最後需要把用到的表都通過DataSet對象載入進來,然後再通過clone方法將其設定成資料來源檢視的架構。
建立採礦結構。
#region Mining Structure
MiningStructure ms = new MiningStructure("MSOrder", "MSOrder");
db.MiningStructures.Add(ms);
ms.Source = new DataSourceViewBinding("DMDSV");
ScalarMiningStructureColumn scOrderNumber = ms.Columns.Add("OrderNumber", "OrderNumber");
scOrderNumber.IsKey = true;
scOrderNumber.Type = MiningStructureColumnTypes.Text;
scOrderNumber.Content = MiningStructureColumnContents.Key;
scOrderNumber.KeyColumns.Add("vAssocSeqOrders", "OrderNumber", OleDbType.WChar);
ScalarMiningStructureColumn scModel = ms.Columns.Add("Model", "Model");
scModel.IsKey = true;
scModel.Type = MiningStructureColumnTypes.Text;
scModel.Content = MiningStructureColumnContents.Key;
scModel.KeyColumns.Add("vAssocSeqLineItems", "Model", OleDbType.WChar);
TableMiningStructureColumn tcLineItems = new TableMiningStructureColumn("SeqLineitems", "SeqLineitems");
tcLineItems.ForeignKeyColumns.Add("vAssocSeqLineItems", "OrderNumber");
tcLineItems.Columns.Add(scModel);
ms.Columns.Add(tcLineItems);
ms.Update();
#endregion
採礦結構的建立實際上也是把資料來源檢視中定義的架構映射成資料採礦結構的一個過程。需要通過對應的MiningColumn對象根據資料來源檢視把需要用到的欄位對應進來。
建立採礦模型,其中通過枚舉屬性Algorithm來設定採礦模型根據採礦結構採用的是哪種挖掘演算法。
#region Mining Model
MiningModel mm = ms.CreateMiningModel(true, "Basket Forecasting Model");
mm.Algorithm = MiningModelAlgorithms.MicrosoftAssociationRules;
mm.Columns["SeqLineitems"].Usage = MiningModelColumnUsages.Predict;
mm.Update();
#endregion
一個採礦模型對應一個採礦結構,所以很多結構直接繼承了採礦結構。這裡唯一需要做的就是,根據建立出來的採礦模型,將其中的一個列設定成預測欄位。
最後,通過AMO處理採礦模型。
#region Process
SSASServer.CaptureXml = true;
db.Process();
SSASServer.CaptureXml = false;
Console.WriteLine("Processing...");
SSASServer.ExecuteCaptureLog(true, true);
#endregion
開啟採礦模型,可以看到採礦模型產生的規則。
當然,實際上在代碼中來建立採礦模型是不被推薦的,有些AMO的深層物件模型目前SQL Server的文檔裡只能提供介面描述而沒有關於模型的介紹和講解,筆者主要是根據項目裡建立的過程然後再回過頭來理解物件模型的含義,而即使國外網站上關於採礦結構和模型中的嵌套結構更是少之又少,所以這篇真的是摸索了好久,不斷的編譯調試和對比才將各個細節打通。無論如何,通過這個過程我們可以更深入的瞭解分析服務底層的物件模型從而更好地去理解和設計我們的採礦模型,同時也可以通過AMO自動地去調整模型。希望通過此篇,會讓更多的朋友來瞭解AMO物件模型。
附:樣本項目的。