[mondrian] 快速入门
一、下载地址
mondrian各个版本和工具等的下载地址:
http://sourceforge.net/projects/mondrian/files/?source=navbar
注意:mondrian-3.5.0及其以下版本都有mondrain的运行示例mondrian.war,而在mondrian-3.5.0以后的版本中就包含了jar和source.jar了
所以,需要先运行示例的需要注意下载的版本
二、入门DEMO
(1)运行demo
在 mondrian.war 中找到 lib 目录下面的 mondrian.war,将其复制到Tomcat下面运行。输入:http://localhost:8080/mondrian/可以看到Mondrian的界面,点击其中的Mondrian Examples可以看到相应的示例。
(2)实现自己的OLAP分析Demo
① sql脚本
CREATE TABLE `person` ( `userid` varchar(100) , `department` varchar(100) , `username` varchar(100), `sex` varchar(100) , `nationality` varchar(100), `post` varchar(100), `zyjslb` varchar(100), `zyjsdj` varchar(100) , `zhixi` varchar(100), `xueli` varchar(100) , `age` int(10) , PRIMARY KEY (`userid`) )
② schema文件
在Mondrian里面的cube是以XML的形式定义的。
他有一个GUI工具workbench来制作cube,可以选择这个GUI生成或者纯手写来简历XML文件。
但是注意,使用workbench时选择的mondrian的jar版本要和实际使用时的一致。
新建personDemo.xml如下
<?xml version="1.0" encoding="UTF-8"?> <Schema name="Mondrian"> <Cube name="Person"> <Table name="PERSON" /> <Dimension name="部门" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有部门" > <Table name="PERSON" alias="a"/> <Level name="部门" column="DEPARTMENT" uniqueMembers="true" /> <Level name="姓名" column="USERNAME" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="性别" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有性别"> <Table name="PERSON" alias="b" /> <Level name="性别" column="SEX" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="专业技术资格类别" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有专业技术资格类别"> <Table name="PERSON" alias="c" /> <Level name="资格类别" column="ZYJSLB" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="专业技术资格等级" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有专业技术资格等级"> <Table name="PERSON" alias="d" /> <Level name="资格等级" column="ZYJSDJ" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="职系" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有职系"> <Table name="PERSON" alias="e" /> <Level name="职系" column="ZHIXI" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="民族" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有民族"> <Table name="PERSON" alias="f" /> <Level name="民族" column="NATIONALITY" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="学历" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有学历"> <Table name="PERSON" alias="g" /> <Level name="学历" column="XUELI" uniqueMembers="true" /> </Hierarchy> </Dimension> <Measure name="人数" column="USERID" aggregator="distinct count" /> </Cube> </Schema>
英文版本
<?xml version="1.0" encoding="UTF-8"?> <Schema name="Mondrian"> <Cube name="Person"> <Table name="PERSON" /> <!-- --> <Dimension name="department" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="alldepartment" > <Table name="PERSON" alias="a"/> <Level name="department" column="DEPARTMENT" uniqueMembers="true" /> <Level name="name" column="USERNAME" uniqueMembers="true" /> </Hierarchy> </Dimension> <!-- --> <Dimension name="xb" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="syxb"> <Table name="PERSON" alias="b" /> <Level name="xb" column="SEX" uniqueMembers="true" /> </Hierarchy> </Dimension> <!-- --> <Dimension name="zyjszglb" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="syzyjszglb"> <Table name="PERSON" alias="c" /> <Level name="zglb" column="ZYJSLB" uniqueMembers="true" /> </Hierarchy> </Dimension> <!-- --> <Dimension name="zyjszgdj" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="syzyjszgdj"> <Table name="PERSON" alias="d" /> <Level name="zgdj" column="ZYJSDJ" uniqueMembers="true" /> </Hierarchy> </Dimension> <!-- --> <Dimension name="zx" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="syzx"> <Table name="PERSON" alias="e" /> <Level name="zx" column="ZHIXI" uniqueMembers="true" /> </Hierarchy> </Dimension> <!-- --> <Dimension name="mz" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="symz"> <Table name="PERSON" alias="f" /> <Level name="mz" column="NATIONALITY" uniqueMembers="true" /> </Hierarchy> </Dimension> <!-- --> <Dimension name="xl" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="syxl"> <Table name="PERSON" alias="g" /> <Level name="xl" column="XUELI" uniqueMembers="true" /> </Hierarchy> </Dimension> <Measure name="personCount" column="USERID" aggregator="distinct count" /> </Cube> </Schema>
③ 编写测试的MDX查询语句保存为person.jsp
<%@ page session="true" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> <%@ taglib uri="http://www.tonbeller.com/jpivot" prefix="jp" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <jp:mondrianQuery id="query01" jdbcDriver="com.mysql.jdbc.Driver" jdbcUrl="jdbc:mysql://localhost:3306/olaptest" ca talogUri="/WEB-INF/queries/personDemo.xml" jdbcUser="root" jdbcPassword="root" connectionPooling="false"> select
NON EMPTY {[Measures].[人数]} on columns, NON EMPTY {([部门].[所有部门],[职系].[所有职系],[专业技术资格类别].[所有专业技术资格类别],[专业技术资格等级].[所有专业技术资格等级],[学历].[所有学历],[民族].[所有民族],[性别].[所有性别])} ON rows from Person </jp:mondrianQuery> <c:set var="title01" scope="session">人员结构多维分析</c:set>
英文版本
%@ page session="true" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> <%@ taglib uri="http://www.tonbeller.com/jpivot" prefix="jp" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <jp:mondrianQuery id="query01" jdbcDriver="com.mysql.jdbc.Driver" jdbcUrl="jdbc:mysql://localhost:3306/test" catalogUri="/WEB-INF/queries/qqDemo.xml" jdbcUser="root" jdbcPassword="root" connectionPooling="false"> select NON EMPTY {[Measures].[personCount]} on columns, NON EMPTY {([department].[alldepartment],[zx].[syzx],[zyjszglb].[syzyjszglb],[zyjszgdj].[syzyjszgdj],[xl].[syxl],[mz].[symz],[xb].[syxb])} ON rows from Person </jp:mondrianQuery> <c:set var="title01" scope="session">ryjgdwfx</c:set>
④ 将personDemo.xml和person.jsp放在测试demo的WEB-INF/queries目录下面
⑤ 在浏览器中输入:http://localhost:8080/mondrian/testpage.jsp?query=person 测试
三、基本概念
(1)变量(度量)
变量是数据度量的指标,是数据的实际意义,即描述数据“是什么”。像上面示例中的人数。
(2)维度
维度是描述与业务主题相关的一组属性,单个属性或属性集合可以构成一个维。如上面示例中的学历、民族、性别等都是维度。
(3)维的层次
一个维往往可以具有多个层次,例如时间维度分为年、季度、月和日等层次,地区维可以是国家、地区、省、市等层次。这里的层次表示数据细化程度,对应概念分层。后面介绍的上钻操作就是由低层概念映射到高层概念。概念分层可除根据概念的全序和偏序关系确定外,还可以通过对数据进行离散化和分组实现。
(4)维的成员
若维是多层次的,则不同的层次的取值构成一个维成员。部分维层次同样可以构成维成员,例如“某年某季度”、“某季某月”等都可以是时间维的成员。
(5)多维数组
多维数组用维和度量的组合表示。一个多维数组可以表示为(维1,维2,……,维n,变量),例如(部门,职系、民族、性别,人数)组成一个多维数组。
(6)数据单元(单元格)
多维数组的取值。当多维数组中每个维都有确定的取值时,就唯一确定一个变量的值。数据单元可以表示为(维1成员,维2成员,……,维N成员,变量的值),例如(人事教育部,技能,回族,男,1人)表示一个数据单元,表示人事教育部职系是技能的回族男性有1人。
(7)事实
事实是不同维度在某一取值下的度量,例如上述人事教育部职系是技能的回族男性有1人就表示在部门、职系、民族、性别四个维度上企业人数的事实度量,并且在为人数事实中包含部门维度人事教育部这一个维度层次,如果将人数事实的所有维度考虑在内,就构成有关人数的多维分析立方体。