这是两个非常常见的SSAS处理异常,网上也能找到很多文章讲解决办法,但很少见关于异常原因的分析,先来看看第一个" OLAP 存储引擎中存在错误: 处理时找到重复的属性键",一个维度表的关键字段,也就是通常讲的主键,是必须具有唯一性的,如果因为维度主键字段出现重复键,真没什么好说的了,太不应该犯这种错误,所以通常大家看到这个处理异常信息都是因为一个非主键属性,例如[Dim Customer]维度里的[Education]属性,和主键[Customer Key]是一对多的关系,Education教育程度的条目是有限的,相同教育程度的顾客会有很多,因此某种意义上来说[Dim Customer]维度的[Education]属性是要允许重复的。

为了演示说明,我先对AW库的Customer表的English Education字段做一些update,再做一个简单的demo cube,只有一个[Dim Customer]维度,一个[English Education]属性,其它设置都默认不做修改。

一个[Fact Customer]事实,数据源映射到一个sql查询,这里只查出维度表主键CustomerKey,因此对应的事实度量值就只有一个[Fact Customer Count]顾客人次了。

然后部署这个项目,收到下图所示的异常信息,EnglishEducation里的Bachelors出现重复属性键,具有Bachelors学士学位的Customer有很多人,这个太正常不过了,出了什么状况呢?我们展开下图高亮所示的Processing English Education日志,找到具体的sql脚本复制出来看看

复制出来的脚本是个distinct查询,执行后如下图所示,问题来了,不难发现第2行和第6行都是Bachelors,的确是重复了(实际生产环境可能无法肉眼识别重复项),那么为什么distinct没起作用呢?

我们对脚本做个简单的修改,看下Bachelors的两条记录有什么不同,下图看到第一行的Bachelors里多了个ascii码9,也就是tab键

在这之前我做的update更新正是对其中一条customer的education内容追加了几个特殊字符,脚本如下:

update DimCustomer set EnglishEducation = 'Bachelors'+char(9)+char(13) where CustomerKey=11001 

那么问题又来了,既然这已经是两个不同的Education了,为什么SSAS会报找到重复键的异常呢?我们把上图的查询结果复制到Excel里

然后进行去重操作,会发现excel去重成功了,也就是说excel是先对这两项都进行trim操作,去除一些特殊字符(例如空格、换行符、Tab键等)

不难料见,SSAS在处理维度数据时也是做了同样的数据清洗工作,而数据库的distinct不能如此简单暴力的做这种清洗工作,SSAS之所以会报找到重复键的异常,简单理解就是SSAS向数据库请求distinct去重的Education列表,数据库查询出来并给到SSAS后,SSAS又自作主张进行了一些清洗工作,然后发现有重复项,总之这个问题是由于MSSQL和SSAS对字符串的处理不一致造成的。这个异常警告是没什么影响的,在ErrorConfiguration里设置KeyDuplicate为Ignore即可,当然,如果你有洁癖强迫症,也可以在etl过程中做手工清洗去除这些特殊字符。。。

至于另一个处理异常" 处理时找不到以下属性键",这个通常是由于数据库的字符集和排序规则引起的,转载下面一篇文章讲解的很透彻

全半角空格导致的Sql Server Analysis Services处理错误

比如说对Customer维度表做以下update更新,分别为两个Customer追加全角和半角空格,那么SSAS在处理11000这个Customer时,发现数据库里对应的Education(有全角空格)在SSAS的数据结构里找不到,结合上面综合理解,SSAS的数据结构里存储的是自己清洗后的结果,这个问题同样也是由于MSSQL和SSAS对字符串的处理不一致造成的

update DimCustomer set EnglishEducation = 'Bachelors'+N' ' where CustomerKey=11000 

update DimCustomer set EnglishEducation = 'Bachelors'+' ' where CustomerKey=11001 

另外需要补充的是这个处理异常也是可以设置为ignore忽略的,但是请注意后果很严重,例如执行上面的两个update更新后,并设置KeyNotFound为Ignore

这时候如果对[Dim Customer]维度单独进行process update,的确可以成功处理,但是处理之前和之后的对比图如下,这种数据异常在某些场合还不容易被发现

而如果是对整个cube进行process full,还是会报以下错误信息,奇怪的是报错的CustomerKey是完全不相干的11918,不清楚具体原因了

既然这个异常如此重要,不能简单暴力的Ignore忽略,那么如何定位到具体的错误记录呢,请参考下面的文章:

SSAS处理时“找不到属性键”的解决办法

设置KeyNotFound为ReportAndContinue后利用错误提示信息中的记录号可以定位到具体的错误数据,也可以用前面介绍的sql like定位。

原文链接

Sql Server Analysis Service 处理时找到重复的属性键、找不到属性键错误(转载)的更多相关文章

  1. Sql Server Analysis Service 转换为UnknownMember的正确设置 (转载)

    转载: http://www.cnblogs.com/OpenCoder/p/4754447.html#commentform 在SSAS中事实表数据被归类到为UnknownMember 的时候分为两 ...

  2. Sql Server Analysis Service 转换为UnknownMember的正确设置

    在SSAS中事实表数据被归类到为UnknownMember 的时候分为两种情况: 第一种情况,在SSAS里面事实表中的外键是null,这种情况SSAS在建事实表和维度时ErrorConfigurati ...

  3. sql server 2008 在与 SQL Server 提示建立连接时出现与网络相关的或特定于实例的错误

    原文地址:http://zhidao.baidu.com/link?url=Ndav32DO9zL5XnltqoqlhvKHbJv_n3Zwihhw4cwF9ffNq8hb8z7h7n3vJVfoeW ...

  4. Sql server analysis service 通过IIS连接时的最大连接数问题

    做过SSAS项目的大部分人都应该知道SSAS是可以通过在IIS上建立代理站点的方式来建立远程连接的,这样可以绕过连接到SSAS时需要在同一个域环境下通过域用户来验证的问题,这样即使连接到SSAS的客户 ...

  5. 微软Sql server analysis service数据挖掘技术

    最新在一个项目中要求用到微软SSAS中的数据挖掘功能,虽然以前做项目的时候也经常用到SSAS中的多维数据集 (就是CUBE),但是始终没有对SSAS中的数据挖掘功能进行过了解.所以借着项目需求这股东风 ...

  6. sql server 2008安装的时候选NT AUTHORITY\NEWORK SERVICE 还是选 NT AUTHORITY\SYSTEM ?

    sql server 2008安装的时候选NT AUTHORITY\NEWORK SERVICE 还是选 NT AUTHORITY\SYSTEM ? sql server 2008安装的时候选NT A ...

  7. SQL Server Reporting Service(SSRS) 第二篇 SSRS数据分组Parent Group

    SQL Server Reporting Service(SSRS) 第一篇 我的第一个SSRS例子默认使用Table进行简单的数据显示,有时为了进行更加直观的数据显示,我们需要按照某个字段对列表进行 ...

  8. 全半角空格导致的Sql Server Analysis Services处理错误(转载)

    问题描述 某维度表的字符串列同时出现两条记录,A记录以半角空格(英文空格)结束,B记录以全角空格(中文空格)结束,除此之外其他部分均相同.Analysis Service处理的时候抛出“Key not ...

  9. 使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能(七)

    假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多电商类网站都有,那么,通过SQL Server Analysis Services的数据挖掘功能,你也可以轻松的来构建类似的功 ...

随机推荐

  1. SQl中Left Join 、Right Join 、Inner Join与Ful Join

    1 left join 左外连接:查询结果以左表数据为准.假如左表有四条数据,右表有三条数据,则查询结果为四条,且都是左表中有的数据. 例如: EMP表: SAL表: 左连接 左连接,表EMP是主表, ...

  2. 【转】如何使用Android Studio把自己的Android library分发到jCenter和Maven Central

    转自:http://www.devtf.cn/?p=760&utm_source=tuicool 如何使用Android Studio把自己的Android library分发到jCenter ...

  3. Java Convert String & Int

    To convert a int to string: int num = 123; String str = String.valueOf(num); To convert a string to ...

  4. oracle dump event

    一.Memory Dumps 1).Global Area ALTER SESSION SET EVENTS 'immediate trace name global_area level n'; 1 ...

  5. day02-java

    day02 大纲: 变量 基本数据类型 数据类型之间的转换 1.变量:存数的,代词,指代的就是它所存的那个数  1)声明:      int a; //声明一个整型的变量,名为a      int b ...

  6. 发送xml或json格式的数据给服务器

    后台通过context.Request.InputStream来接收 #region 发送消息 + void SendMessage() /// <summary> /// 发送消息 // ...

  7. 3、DOM操作

    一.认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面 ...

  8. Spring Boot 1 创建Demo

    Spring Boot的主要优点: 为所有Spring开发者更快的入门 开箱即用,提供各种默认配置来简化项目配置 内嵌式容器简化Web项目 没有冗余代码生成和XML配置的要求 入门操作: 1.打开ht ...

  9. freemark 判断是否为空 是否存在

    <!--1\---><!--判断aaa是否不为空,eclipse插件老报错.---><#if aaa??>  ${aaa}</#if><!--2\ ...

  10. Greenplum:学习资料

    Greenplum技术浅析:http://www.cnblogs.com/end/archive/2012/08/17/2644290.html Greenplum 数据库架构分析:http://ww ...