使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能(七)
假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多电商类网站都有,那么,通过SQL Server Analysis Services的数据挖掘功能,你也可以轻松的来构建类似的功能。
上一篇中介绍的是如何通过DMX来创建挖掘模型,这一篇讲简单介绍如何通过编程的方式来创建挖掘模型。
通过编程的方式主要通过AMO来实现,分析服务的所有跟架构相关的实现,包括多维数据集和数据挖掘,都通过这个接口实现。
AMO对象树包含了支持多维数据集和数据挖掘所有的对象模型,在我这篇随笔中可以详细看到它的结构。
对象的结构稍微复杂一些,但我们关注的有三个部分:
通过这两个对象连接到分析服务数据库并且操作分析服务数据库实例。
然后通过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对象模型。
使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能(七)的更多相关文章
- SQL Server Analysis Services 数据挖掘
假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多 电商类网站都有,那么,通过SQL Server Analysis Services的数据挖掘功能,你也可以轻松的来构建类似的 ...
- SQL Server Analysis Services 数据挖掘(1)
来源: http://technet.microsoft.com/zh-cn/library/dn633476.aspx 假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多 电 ...
- SQL Server Analysis Services SSAS Processing Error Configurations
转载:https://www.mssqltips.com/sqlservertip/3476/sql-server-analysis-services-ssas-processing-error-co ...
- 全半角空格导致的Sql Server Analysis Services处理错误(转载)
问题描述 某维度表的字符串列同时出现两条记录,A记录以半角空格(英文空格)结束,B记录以全角空格(中文空格)结束,除此之外其他部分均相同.Analysis Service处理的时候抛出“Key not ...
- 微软Sql server analysis service数据挖掘技术
最新在一个项目中要求用到微软SSAS中的数据挖掘功能,虽然以前做项目的时候也经常用到SSAS中的多维数据集 (就是CUBE),但是始终没有对SSAS中的数据挖掘功能进行过了解.所以借着项目需求这股东风 ...
- Sql Server Analysis Service 处理时找到重复的属性键、找不到属性键错误(转载)
这是两个非常常见的SSAS处理异常,网上也能找到很多文章讲解决办法,但很少见关于异常原因的分析,先来看看第一个" OLAP 存储引擎中存在错误: 处理时找到重复的属性键",一个维度 ...
- SQL Server Reporting Services本机模式下的权限管理
SQL Server Reporting Services在安装配置后,缺省只给BUILTIN\Administrators用户组(实际上只有本机的Administrator用户)提供管理权限.所以所 ...
- SrsDataConnector The SQL Server Reporting Services account is a local user and is not supported.
这次使用OS+SQL的镜像还原系统后安装了CRM 2015,主要流程是 安装IIS/AD,SSRS ,CRM2015.自带的SQL中SSRS没有安装完全,需配置一下. 这一切都满顺利的,最后在安装 S ...
- 充分利用 SQL Server Reporting Services 图表
最近在查SSRS的一些文章,看到MSDN在有一篇不错的文章,许多图表设置都有说明,共享给大家.. 其中有说明在SSRS中如果去写条件表达写和报表属性中的“自定义代码”,文章相对比较长,需要大家耐心的查 ...
随机推荐
- Android Studio导入第三方jar包
直接将jar包拷贝到app/libs下,然后在app下的build.gradle中添加此jar的依赖.如下: dependencies { compile fileTree(dir: 'libs', ...
- c#反射-动态加载dll简单例子
假设已有组件ClassLibraryTEST.dll,放置于程序目录下.组件中ClassLibraryTEST命名空间下有TEST类,类中有方法sum.下面示例就是动态加载组件并调用sum方法的简例: ...
- iOS开发UI篇—懒加载
iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...
- redis源码安装
#安装目录 mkdir -p /data/apps/redis cd /data/tgz wget http://download.redis.io/releases/redis-3.2.1.tar. ...
- Linux 下Nginx编译安装
Untitled .note-content {font-family: 'Helvetica Neue', Arial, 'Hiragino Sans GB', STHeiti, 'Microsof ...
- POJ1091跳蚤(容斥 + 唯一分解 + 快速幂)
题意:规定每次跳的单位 a1, a2, a3 …… , an, M,次数可以为b1, b2, b3 …… bn, bn + 1, 正好表示往左,负号表示往右, 求能否调到左边一位,即 a1* b1 ...
- jedis池的作用
一.jedis池的介绍 相信大家都用过线程池或者是jdbc的连接池,使用池可以减少系统在使用所需对象时创建对象的开销,从而提高系统性能和效率.jedis池也是如此,那么我们该如何使用jedis池呢? ...
- Fedora 24 Gnome Boxes 无法ping通网络
安装Fedora 24在试用虚拟机时发现无法ping通外网. 我傻傻地以为是软件问题. 问题描述: 尝试ping程序来测试网络连通性: (我之前也是ping百度,后来在为了少打字百度了一些比较短的域名 ...
- Solr学习总结(一)Solr介绍
最近一直在搞Solr的问题,研究Solr 的优化,搜索引擎的bug修改等,这几天终于有时间,闲下来总结分享,以便大家参考,与大家一起来共同学习. Solr是一个基于Lucene的全文搜索引擎,同 ...
- Microsoft SQL Server 2008 R2官方中文版(SQL2008下载).rar
Microsoft SQL Server 2008 R2官方中文版(SQL2008下载).rar