java Mondrian总结.doc

时间:2025-08-26 16:24:01来源:互联网

下面小编就为大家分享一篇java Mondrian总结.doc,具有很好的参考价值,希望对大家有所帮助。

简介

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/ 声明用户自定义函数

本站部分内容转载自互联网,如果有网站内容侵犯了您的权益,可直接联系我们删除,感谢支持!