基于mondrain 的原理纠正特殊指标值
原文地址: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 的原理纠正特殊指标值的更多相关文章
- SQL Server调优系列进阶篇(查询语句运行几个指标值监测)
前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...
- SQL Server调优系列进阶篇 - 查询语句运行几个指标值监测
前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...
- SQL Server 调优系列进阶篇 - 查询语句运行几个指标值监测
前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...
- Spark MLlib LDA 基于GraphX实现原理及源代码分析
LDA背景 LDA(隐含狄利克雷分布)是一个主题聚类模型,是当前主题聚类领域最火.最有力的模型之中的一个,它能通过多轮迭代把特征向量集合按主题分类.眼下,广泛运用在文本主题聚类中. LDA的开源实现有 ...
- c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)
c#封装DBHelper类 public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...
- JavaScript 事件循环及异步原理(完全指北)
引言 最近面试被问到,JS 既然是单线程的,为什么可以执行异步操作? 当时脑子蒙了,思维一直被困在 单线程 这个问题上,一直在思考单线程为什么可以额外运行任务,其实在我很早以前写的博客里面有写相关的内 ...
- 基于Lucene查询原理分析Elasticsearch的性能
前言 Elasticsearch是一个很火的分布式搜索系统,提供了非常强大而且易用的查询和分析能力,包括全文索引.模糊查询.多条件组合查询.地理位置查询等等,而且具有一定的分析聚合能力.因为其查询场景 ...
- 基于vue2.0原理-自己实现MVVM框架之computed计算属性
基于上一篇data的双向绑定,这一篇来聊聊computed的实现原理及自己实现计算属性. 一.先聊下Computed的用法 写一个最简单的小demo,展示用户的名字和年龄,代码如下: <body ...
- mysql之 MySQL 主从基于 GTID 复制原理概述
一. 什么是GTID ( Global transaction identifiers ):MySQL-5.6.2开始支持,MySQL-5.6.10后完善,GTID 分成两部分,一部分是服务的UUid ...
随机推荐
- mysql 5.6.20 数据库中文乱码解决方法
1.打开mysql5.6安装目录下面的文件my-default.ini在[client]下面添加default-character-set=utf8(如果没有[client]自己手动添加).然后在[m ...
- redis-cli 常用命令
1.连接操作相关的命令 quit:关闭连接(connection) auth:简单密码认证 2.对value操作的命令 exists(key):确认一个key是否存在 del(key):删除一个key ...
- 跟着百度学PHP[14]-PDO-优化驱动
使用方法设置预定义变量 PDO的方法/属性 PDO::beginTransaction — Initiates a transaction PDO::commit — Commits a transa ...
- "/usr/local/openresty/nginx/html/index.html" is forbidden (13: Permission denied), client: 10.0.4.118, server: localhost, request: "GET / HTTP/1.1"
openrestry 安装之后 报"/usr/local/openresty/nginx/html/index.html" is forbidden (13: Permission ...
- 【Mac + Appium + Python3.6学习(五)】之常用的Android自动化测试API总结
Github测试样例地址:https://github.com/appium-boneyard/sample-code/tree/master/sample-code/examples ①定位text ...
- 海康网络摄像机调用SDK解码Java版
两个回调函数: FRealDataCallBack 实现预览回调数据 DecCallBack 解码回调函数 在HCNetSDK.java补充相关函数和结构声明 //播放库函数声明,PlayCtrl.d ...
- 深入了解Go Playground
简介 2010年9月,我们介绍了Go Playground,这是一个完全由Go代码组成和返回程序运行结果的web服务器. 如果你是一位Go程序员,那你很可能已经通过阅读Go教程或执行Go文档中的示例程 ...
- XML简单学习
XML简单概述 1.Extensible Markup language可扩展标记语言; 2.作用:具有层次性的描述有关系的数据: 体现在:描述数据关系:软件配置,以描述程序模块之间的关系: 语法介绍 ...
- 【BZOJ】2014: [Usaco2010 Feb]Chocolate Buying(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=2014 这应该是显然的贪心吧,先排序,然后按花费取 #include <cstdio> # ...
- (转)c/c++内存对齐问题
struct/class/unio内存对齐: http://blog.csdn.net/microsues/article/details/6140329 class函数占用字节数问题: http:/ ...