原文地址:http://www.cnblogs.com/qiaoyihang/p/7348385.html  

下面有两张表

数学试卷成绩

表1

学号

省份

批次

学校

试卷成绩

数学试卷小题成绩

表2

学号

小题号

分值

成绩

下面是星型模型:

维度:省份,批次,学校     指标:标准差,信度(比较有代表性)

星型模型表

表3

省份(维度)

批次(维度)

学校(维度)

试卷最高分(指标)

试卷标准差(指标)

试卷信度(指标)

上面是我的OLAP 星型模型,在我同时选中维度:省份,批次,学校  指标:信度这个信度是正确的。

如果我要查询省份成绩的试卷信度,在这个情况下

在我选中  维度:省份  指标:信度

Mondrian支持sum,count,avg等,如下图

但是并不没有信度的计算,同时,信度不能用sum累加,更不能count,min,max进行聚合。

我在从表3中通过省份查询,会得出多条记录。

我如何解决查询选择省份,得出正确的信度值?

我解决的方式是:

通过Mondrian的聚合表优化的特性:

下面是三张聚合表:

agg_1(表4)

省份

批次

试卷最高分(指标)

试卷标准差(指标)

试卷信度(指标)

agg_2(表5)

省份

学校

试卷最高分(指标)

试卷标准差(指标)

试卷信度(指标)

agg_3(表6)

省份

试卷最高分(指标)

试卷标准差(指标)

试卷信度(指标)

mondrian的聚合表使用规则是:

agg_1(表4)

agg_2(表5)

agg_3(表6)

上面是三张聚合表,如果我们查询的指标是:试卷最高分, 上面的三张聚合表都身份维度

那么,从上面的任何一张聚合表查询的结果都正确。

刨根究底的人会好奇,mondrian作为OLAP服务器引擎,会查询哪一张聚合表得到结果?

mondrian会首先查询上面所有的聚合表,获取每张表的数据量。

表的数据量关系依次是:  agg_1 > agg_2>agg_3

为了提升性能,mondrian会选择数据量最少的表,就是agg_3,数据量最少的表,相应最快。

我就是应用这条规则:

如果我创建了agg_3这张聚合表,mondrian引擎就好选择聚合表agg_3上查询信度,

在星型模型设计器上,

我选择红色圈起来的,其得到的结果都是一样的。

如果,我要查询的维度变了

在我选中   维度:批次  指标:信度

这个维度时,mondrian引擎,会选择

agg_1(表4)

省份

批次

试卷最高分(指标)

试卷标准差(指标)

试卷信度(指标)

在这种情况下,批次对应了多个省份,

根据批次查询的信度,就是多个省份的信度值

如果前面是sum,查询的结果sum就是多个省份的信度值累加,这是错误的。

如果要查询到正确的信度值

需要创建一张聚合表

agg_batch(表7)

批次

试卷最高分(指标)

试卷标准差(指标)

试卷信度(指标)

这个聚合表只有一个批次维度,查询的信度值才是正确的。

如果 我操作选中

维度:省份,批次  指标:信度

mondrian引擎,会选择agg_1(表4),得到的结果才是正确的,这种维度组合,agg_1的结果才会正确。

OK,通过上面的例子,我们对信度指标,聚合表已经有了个大概的了解。

这个设计有个缺点

每一种维度组合,都需要有一种维度表对应,信度,平均分,区分度等指标查询的结果才能保证正确。

需要对OLAP星型模型的所有维度进行组合

组合的结果集为:

如果有5个维度

取一个维度: C(5,1) 5种组合

取二个维度: C(5,2) 10种组合

取三个维度: C(5,3) 10种组合

取四个维度: C(5,4) 5种组合

取五个维度: C(5,5) 1种组合

总的组合数为: C(5,1)+ C(5,2)+ C(5,3)+ C(5,4)+ C(5,5) = 31种

如果有6个维度

C(6,1)+ C(6,2)+ C(6,3)+ C(6,4)+ C(6,5)+C(6,6) = 63种

如果有8个维度

2的8次方减1等于255种

如果有3个维度

2的3次方减1等于7种

一个星型模型的维度是有限的,kylin最大支持15个维度,我觉得,Mondrian也是需要有极限,2的16次方是65 536。

16个维度就产生65 535个聚合表。

通过梳理我们业务,差不多有15到16个维度,但通过去除一些无意义的组合(例如,年份,科目试卷,两个维度只选择一个维度,其OLAP组合没有意义)

维度降低为11个,也就是2047张聚合表。

但是,实际应用中。一般模型的维度一般都在8个以内,其聚合表也就是255张表。在计算上是可控的。

基于mondrain 的原理纠正特殊指标值的更多相关文章

  1. SQL Server调优系列进阶篇(查询语句运行几个指标值监测)

    前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...

  2. SQL Server调优系列进阶篇 - 查询语句运行几个指标值监测

    前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...

  3. SQL Server 调优系列进阶篇 - 查询语句运行几个指标值监测

    前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...

  4. Spark MLlib LDA 基于GraphX实现原理及源代码分析

    LDA背景 LDA(隐含狄利克雷分布)是一个主题聚类模型,是当前主题聚类领域最火.最有力的模型之中的一个,它能通过多轮迭代把特征向量集合按主题分类.眼下,广泛运用在文本主题聚类中. LDA的开源实现有 ...

  5. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

  6. JavaScript 事件循环及异步原理(完全指北)

    引言 最近面试被问到,JS 既然是单线程的,为什么可以执行异步操作? 当时脑子蒙了,思维一直被困在 单线程 这个问题上,一直在思考单线程为什么可以额外运行任务,其实在我很早以前写的博客里面有写相关的内 ...

  7. 基于Lucene查询原理分析Elasticsearch的性能

    前言 Elasticsearch是一个很火的分布式搜索系统,提供了非常强大而且易用的查询和分析能力,包括全文索引.模糊查询.多条件组合查询.地理位置查询等等,而且具有一定的分析聚合能力.因为其查询场景 ...

  8. 基于vue2.0原理-自己实现MVVM框架之computed计算属性

    基于上一篇data的双向绑定,这一篇来聊聊computed的实现原理及自己实现计算属性. 一.先聊下Computed的用法 写一个最简单的小demo,展示用户的名字和年龄,代码如下: <body ...

  9. mysql之 MySQL 主从基于 GTID 复制原理概述

    一. 什么是GTID ( Global transaction identifiers ):MySQL-5.6.2开始支持,MySQL-5.6.10后完善,GTID 分成两部分,一部分是服务的UUid ...

随机推荐

  1. POSTGRESQL 9.1 FATAL: password authentication failed for user "postgres"

    1.配置postgreql 可以远程访问: sudo vim /etc/postgresql/9.1/main/postgresql.conf root@ubuntuserver:~# sudo vi ...

  2. U盘工作原理(转)

    u盘工作原理 一. U盘基本工作原理 通用串行总线(Universal serial Bus)是一种快速灵活的接口, 当一个USB设备插入主机时,由于USB设备硬件本身的原因,它会使USB总线的数据信 ...

  3. php-fpm 如果dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。

    php-fpm未优化网友反映的问题 1.最近将Wordpress迁移至阿里云.由于自己的服务器是云服务器,硬盘和内存都比较小,所以内存经常不够使,通过ps ax命令查看后,发现启动php-fpm进程数 ...

  4. php yaf框架扩展实践五——数据层

    从狭义角度上来理解数据层就是数据库,比较广义的理解来看数据库.远程数据.文件等都可以看做数据层.项目初期的时候一般单一的数据库就可以了,随着流量的增大就要对数据层做很多的改进,例如增加从库分散读压力, ...

  5. JS刷新页面后滚动条的位置不变

    有时候,在网页中点击了页面中的按钮或是刷新了页面后,页面滚动条又 会回到顶部,想看后面的记录就又要拖动滚动条,或者要按翻页键,非常不方便,想在提交页面或者在页面刷新的时候仍然保持滚动条的位置不变,最好 ...

  6. wpf的MVVM框架

    http://www.cnblogs.com/KnightsWarrior/archive/2010/11/01/1866641.html 框架名字的介绍在 文章的后面

  7. plsql参数

    PL/SQL中对out,in out参数使用的? 默认形参会复制一份实参的副本,然后在内部传递,修改等,发生异常,不会赋值给实参,控制权交还调用环境,而实参值不变,还是调用前的值.而使用了NOCOPY ...

  8. JUnit小记

    一.参数测试 /** * 1.更改测试运行器为RunWith(Parameterized.class) * 2.声明变量用来存放预期值与结果值 * 3.为测试类声明一个带有参数的公共构造方法,并在其中 ...

  9. .net webapi项目跨域问题及解决方案

    问题: 1.项目完成,部署到不同的iis版本上,跨域访问有的通有的不通 解决办法: 1.将复杂请求改为简单请求 2.代码中去掉所有跨域设置,配置中添加或修改节点 <system.webServe ...

  10. django用户认证系统——重置密码7

    当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...