简介
github地址:https://github.com/pentaho/mondrian
Mondrian是一个开源项目。一个用Java写成的OLAP引擎。它用MDX语言实现查询,从关系数据库中读取数据。然后经过java API以多维的方式对结果进行展示。
MDX(Multidimensional Expressions)是多维数据库(OLAP 数据库)的查询语言.
Mondrian是java中的一个OLAP与MDX解析引擎,它会解析MDX,转换成SQL来查询关系数据库
JPivot是 Mondrian 默认的表现层工具,它是一个JSP自定制的标签库,可以绘制OLAP 分析图表。
Mondrian支持的数据库或数据仓库主要有:LucidDb、Oracle、 Access、MySQL、Sybase、Ingres、PostgreSQL、Hypersonic、Teredata等。
olap4j 是mdx 的Java 接口标准,类似于JDBC 是sql 的接口标准。
性能:
modrian只是rolap的引擎,它只是将mdx转换成sql,最终的查询还是要通过数据库来做的,所以性能的压力大多数在DB上,如果出现性能问题,首先要测试mondrian生成的sql在数据库中的执行效率,然后针对数据库进行优化。
学习文章:
http://www.doczj.com/doc/4bd36dfe7fd5360cbb1adb07-5.html
OLAP的基本概念
OLAP用于支持复杂的分析操作,
Cube立方体的概念:
是多维立方体的简称,在Mondrian里面的cube是以XML的形式定义的
维度(Dimension):维度提供了分类描述,表示一类分析角度,用户通过维度分析度量数据。比如上图中的三个维度:时间、产品、地域
度量(Measures):度量表示用来聚合分析的数字信息,度量的集合组合成了一个特殊的维度。如数量、销售额等。
级别(Level):一个维度上可以包含的层次结构,表示特定的分类。如上图中地域维度可以包含的级别层次级:国家、省、市;时间维度包含的级别层次包含:年、季度、月、日等。
成员,是最重要的概念之一,一个成员是维度(包括度量<Measures>)上的项目值。如上图时间维度上”年“级别的成员就包含:2000,2001,2002,2003...月成员包含:1、2、3等。
计算成员,是一种运行通过特殊表示式动态计算的成员。也就形成了度量(Measures)的结果。计算成员不影响现有的Cube数据,它基于cube数据,通过各种数学表达式和各种函数定义,可以创建复杂的表达式。任何动态分析功能,都可以通过计算成员实现,比如实现占比,同期比等等。
Mondrian Schema简介
Schema 定义了一个多维数据库。包含了一个逻辑模型,而这个逻辑模型的目的是为了书写 MDX 语言的查询语句。这个逻辑模型实际上提供了这几个概念:Cubes (立方体)、维度( Dimensions )、层次( Hierarchies )、级别( Levels )、和成员( Members )。而一个 schema 文件就是编辑这个 schema 的一个 xml 文件。
实例
<?xml version='1.0' ?> <Schema name='ukefu'> <Cube name='咨询'> <View alias="agentservice"> <SQL> <![CDATA[ select * from uk_agentservice where 1 = 1 <#if sessiontype?? && sessiontype!=""> AND sessiontype = '${sessiontype!''}'</#if> <#if businesssessiontype?? && businesssessiontype!=""> AND businesssessiontype = '${businesssessiontype!''}'</#if> <#if skill?? && skill!=""> AND agentskill = '${skill!''}'</#if> <#if agent?? && agent!=""> AND agentno = '${agent!''}'</#if> <#if orgi?? && orgi!=""> AND orgi = '${orgi!''}'</#if> <#if begin?? && begin!=""> AND createtime >= str_to_date('${begin!''}', '%Y-%m-%d %H:%i:%s')</#if> <#if end?? && end!=""> AND createtime <= str_to_date('${end!''} 23:59:59', '%Y-%m-%d %H:%i:%s')</#if> ]]> </SQL> </View> <Dimension name='businesssessiontype' foreignKey="businesssessiontype"> <Hierarchy hasAll='true' allMemberName='合计' primaryKey="id"> <Table name="uk_session_type"></Table> <Level name='业务分类' column='name' uniqueMembers='false' type='' /> </Hierarchy> </Dimension> <Dimension name='domainsessiontype' foreignKey="domainsessiontype"> <Hierarchy hasAll='true' allMemberName='合计' primaryKey="id"> <Table name="uk_session_type"></Table> <Level name='业务领域' column='name' uniqueMembers='false' type='' /> </Hierarchy> </Dimension> <Dimension name='sessiontype' foreignKey="sessiontype"> <Hierarchy hasAll='true' allMemberName='合计' primaryKey="id"> <Table name="uk_session_type"></Table> <Level name='服务类型' column='name' uniqueMembers='false' type='' /> </Hierarchy> </Dimension> <Dimension name='agent' foreignKey="agentno"> <Hierarchy hasAll='true' allMemberName='合计' primaryKey="id"> <Table name="uk_user"></Table> <Level name='坐席' column='uname' uniqueMembers='false' type='' /> </Hierarchy> </Dimension> <Dimension name='skill' foreignKey="agentskill"> <Hierarchy hasAll='true' allMemberName='合计' primaryKey="id"> <Table name="uk_organ"></Table> <Level name='技能组' column='name' uniqueMembers='false' type='' /> </Hierarchy> </Dimension> <Dimension name='time'> <Hierarchy hasAll='true' allMemberName='合计'> <Level name='日期' column='createtime' uniqueMembers='false'> <KeyExpression> <SQL dialect="generic">date_format(agentservice.createtime,'%Y-%m-%d')</SQL> <SQL dialect="mysql">date_format(agentservice.createtime,'%Y-%m-%d')</SQL> <SQL dialect="oracle">TO_DATE(agentservice.createtime,'YYYY-MM-DD')</SQL> </KeyExpression> </Level> </Hierarchy> </Dimension> <Measure name='咨询数量' column='id' aggregator='count' formatString=''></Measure> <Measure name='平均等待时长_ms' column='waittingtime' aggregator='avg' ></Measure> <Measure name='平均咨询时长_ms' column='sessiontimes' aggregator='avg' ></Measure> <CalculatedMember name="平均等待时长" dimension="Measures" formula="[Measures].[平均等待时长_ms]/1000"/> <CalculatedMember name="平均咨询时长" dimension="Measures" formula="[Measures].[平均咨询时长_ms]/1000"/> </Cube> </Schema> |
Cubes
一个 Cube 是一系列维度 (Dimension) 和度量 (Measure) 的集合区域。在Cube 中, Dimension 和 Measure 的共同地方就是共用一个事实表。
属性
属性名 |
含义 |
name |
Cube的名字 |
caption |
标题,在表示层显示的 |
cache |
是否对Cube对应的实表用mondrian进行存储,默认为true |
enabled |
布尔类型,如果是被激活,Cubes被执行,否则就不予理睬,默认为true |
MDX基本语法
Schema包含立方体、虚拟立方体、共享维度、角色
Cube维度和度量的集合,以事实表为中心
Table事实表
AggName声明一个聚集表
aggElements聚集表设置,结构见下
AggPattern声明一批聚集表
aggElements
Dimension维度
Hierarchy维度层次
relation物理表、视图,结构见下
Closure映射父子层次关系
Level一个层次
DimensionUsage引用共享维度
Measure度量
CalculatedMemberProperty/
CalculatedMember计算成员
NamedSet命名集合
Formula/公式
UserDefinedFunction/ 声明用户自定义函数