提要:本文主要是对一个java开源项目——mondrian,OLAP引擎——的技术使用和相关概念做了简单的介绍和描述。 关键字:mondrian OLAP MDX
一、引言
Mondrian, 蒙得里安·皮特1872-1944荷兰画家,作品以交错的三原色为基色的垂直线条和平面为特点,他的著作包括 新造型主义(1920年),对抽象艺术的发展曾经产生很深影响。——金山词霸如是说。
不过,本文所要讨论的可不是这位艺术家。那到底mondrian是什么呢?
Mondrian是一个开源项目。一个用Java写成的OLAP(在线分析性处理)引擎。它用MDX语言实现查询,从关系数据库(RDBMS)中读取数据。然后经过Java API用多维的方式对结果进行展示。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
我们都知道,在线分析处理(OLAP)要实时地分析大量数据。“online”这个词的含义就是即使相关的数据量是巨大的——可能以GB为单位——系统也要足够快的响应以显示结果。
OLAP用了多维分析的技术。尽管关系型数据库所存储的所有数据都是以行和列的形式存在的,但一个多维数据集还是可以由轴(axes)和单元(cell)组成。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><img alt="" hspace="0" src="file:///D:/MyPrivate/MyArticle/Mondrian/agmdxintro1.jpg" align="baseline" border="0"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype>
在上面的例子中,时间是个维度(dimension),而它下面的层次(Hierarchies)又分为半年、季度等级别(Level)。
二、感性认识——运行一个小实例
我们暂时先不讨论Mondrian所用到的一些技术。我们可以先从一个小例子开始,不必在意每个细节,只是希望大家有个感性认识先。在实施这个例子的过程中,或许读者就能见些端倪。
首先应该到http://sourceforge.net/projects/mondrian/下载mondrian的最新版本。这是一个zip包,包括我们要用到的lib和一个例子。
当然,读者完全可以运行mondrian自带的实例,不过这个例子有些纷繁复杂,除了Mondrian本身还有其它技术在里面,不大容易讲清楚,也不太适合初学者学习。所以,笔者在这里设计一个简洁干净的最小化实例。
本文所阐述的实例环境是Windows2000+Tomcat+Oracle。并且认为读者已经针对jdk和Tomcat做了正确的开发环境的设置。
2.1准备工作
在%Tomcat%/webapp/依次建立mywebapp,mywebapp/WEB-INF,mywebapp/WEB-INF/lib,把
mondrian.war/WEB-INF/lib/mondrian.jar,javacup.jar,
xalan.jar,junit.jar
等相关的jar包copy到
%TOMCAT_HOME%
/webapps/mywebapp/lib/
下。
2.2数据库结构
在这个tiny的系统中,数据库有3个表tb_employee(职员表),tb_time(时间表),tb_salary(薪酬表)。表结构如下:
drop table tb_employee;
create table tb_employee
(
employee_id number, --职员id
employee_name varchar2(10) --职员姓名
);
drop table tb_time;
create table tb_time
(
time_id number, --时间id
the_year char(4), --年
the_month char(2) --月
);
drop table tb_salary;
create table tb_salary
(
employee_id number, --职员id
time_id number, --时间id
salary number(19,4) --薪酬
);
当然,为了使系统能够运行,还需要读者向数据库表中插入一些数据。
2.3根据数据库表的结构,书写schema文件
<?xml version="1.0"?>
<Schema name="Mondrian">
<Cube name="CubeTest">
<Table name="TB_SALARY" />
<Dimension name="Employee" foreignKey="EMPLOYEE_ID" >
<Hierarchy hasAll="true" primaryKey="EMPLOYEE_ID">
<Table name="TB_EMPLOYEE" />
<Level name="employeeId" column="EMPLOYEE_ID" uniqueMembers="true" >
<Property name="employeeName" column="EMPLOYEE_NAME"/>
</Level>
</Hierarchy>
</Dimension>
<Dimension name="Time" foreignKey="TIME_ID" >
<Hierarchy hasAll="false" primaryKey="TIME_ID" >
<Table name="TB_TIME" />
<Level name="year" column="THE_YEAR" uniqueMembers="false" />
<Level name="month" column="THE_MONTH" uniqueMembers="false" />
</Hierarchy>
</Dimension>
<Measure name="Salary" column="SALARY" aggregator="sum" />
</Cube>
</Schema>
文件路径为mywebapp/WEB-INF/mondriantest.xml
2.4利用MDX查询
mywebapp/mondriantest.jsp
1 <%@ page import="mondrian.olap.*"%>
<%
2 Connection connection =
DriverManager.getConnection
("Provider=mondrian;
Jdbc=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:dbname;
JdbcUser=dbuser;
JdbcPassword=dbpasswd;
Catalog=file:///c:/Tomcat4.1/webapps/mywebapp/WEB-INF/mondriantest.xml;
JdbcDrivers=oracle.jdbc.driver.OracleDriver;",null,false);
3 String queryStr=
"select {[Measures].[Salary]} ON COLUMNS,
{[Employee].[employeeId].Members} ON ROWS
from CubeTest ";
4 Query query =connection.parseQuery(queryStr);
5 Result result = connection.execute(query);
out.println("get result");
%>
2.5运行
这时启动to
mcat,
在浏览器地址栏中输入
http://localhost:8080/mywebapp/ mondriantest.jsp即可。
三、深入探讨
3.1 API
mondrian为客户端应用程序提供了API接口以进行查询。而这些API对于任何用过JDBC的人都会觉得似曾相识的。主要的不同点是查询语言的不同:Mondrian用的是MDX('Multi-Dimensional eXpressions'),而JDBC则用的是SQL。
和JDBC一样,也是要经过建立连接,形成查询语句,执行查询得到结果集等几个步骤的。
我们来看看mondriantest.jsp的代码
第1行:import mondrian.olap.*
这是引入我们所需的类,下面要用到的DriverManager、Connection、Query、Result都在这个package内。这个package一般位于mondrian.jar中。
第2行:Connection connection =
DriverManager.getConnection
("Provider=mondrian;
Jdbc=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:dbname;
JdbcUser=dbuser;
JdbcPassword=dbpasswd;
Catalog=file:///c:/Tomcat4.1/webapps/mywebapp/WEB-INF/mondriantest.xml;
JdbcDrivers=oracle.jdbc.driver.OracleDriver;",null,false);
通过DriverManager创建一个Connection的实例,建立起数据库连接。
其中Jdbc=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:dbname; 是设置数据库的ip和库名。JdbcUser=dbuser; 设置数据库用户。JdbcPassword=dbpasswd; 设置用户密码。而
Catalog=file:///c:/Tomcat4.1/webapps/mywebapp/WEB-INF/mondriantest.xml; 就是设置MDX语句查询要对应的schema文件的路径
第3行:String queryStr=
"select {[Measures].[Salary]} ON COLUMNS,
{[Employee].[employeeId].Members} ON ROWS
from CubeTest ";
形成MDX的查询语句。MDX语句的形式和schema文件的设定是密切相关的,当然schema文件的形成也是由数据库结构决定的。
第4行:Query query =connection.parseQuery(queryStr);对MDX语句进行分析处理,是否符合schema文件定义、数据库结构和数据库数据。
第5行:Result result = connection.execute(query);执行查询,得到结果集。
我们发现Query类似于JDBC的Statement,而Result则酷似于ResultSet。
3.2 schema
3.2.1什么是schema
schema定义了一个多维数据库。包含了一个逻辑模型,而这个逻辑模型的目的是为了书写MDX语言的查询语句。这个逻辑模型实际上提供了这几个概念:Cubes,维度(Dimensions), 层次(Hierarchies),级别(Levels),和成员(Members)。
而schema文件就是编辑这个schema的一个xml文件。在这个文件中形成逻辑模型和数据库物理模型的对应。
3.2.2 schema的逻辑结构
3.2.2.1 Cube
一个Cube是一系列维度(Dimension)和度量(Measure)的集合区域。在Cube中,Dimension和Measure的共同地方就是共用一个事实表。
例:
<Cube name="CubeTest">
<Table name="TB_SALARY" />
…….
</Cube>
<Table>标签确定了所用的事实表的表名。
3.2.2.2 Measure
一个度量,简单的说,就是要被计算的值。
例:
<Measure name="Salary" column="SALARY" aggregator="sum" />
<Measure>标签有3个必要的属性name(度量名),column(在事实表中的字段名), aggregation(聚合所用的方法)。
3.2.2.3 Dimenesion
而维度一般有其相对应的维度表。
例:
<Dimension name="Time" foreignKey="TIME_ID" >
<Hierarchy hasAll="false" primaryKey="TIME_ID" >
<Table name="TB_TIME" />
<Level name="year" column="THE_YEAR" uniqueMembers="false" />
<Level name="month" column="THE_MONTH" uniqueMembers="false" />
</Hierarchy>
</Dimension>
一般Dimesion包含层次(Hierarchy),而hierarchy是由级别(Level)组成。
<Dimension>标签的foreignKey是事实表中的字段,<Hierarchy>标签的primaryKey是维度表中的字段,通过这种方式把事实表和维度表关联起来。<Hierarchy>标签下的<Table>标签就指明了维度表名。而若干个Level对应着维度表的若干字段。
3.3 MDX语言
MDX是为了查询多维数据的,而SQL是为了查询关系数据库的。而Mondrian所涉及到的一些MDX概念、MDX语法以及系统定义的MDX函数和微软的MDX十分接近,差别微小。完全可以参考微软的帮助文档进行学习。在此就不在赘述。
四、结语
Mondrian作为基于java的OLAP引擎,而且是开源的项目,为那些基于java的项目而要脱离微软构架但又不得不对大量数据进行分析的项目又提供了一种可行的方案。希望它也能象蒙得里安·皮特对抽象艺术的发展产生影响一样起到一定的作用。
分享到:
相关推荐
三、Mondrian的开发工具——Schema Workbench Schema Workbench是Mondrian提供的一个图形化工具,用于创建和编辑Mondrian的XML schema文件。通过这个工具,开发者可以直观地设计多维数据模型,包括维度、层次、度量...
仔细阅读并理解这些文档,将有助于你更好地利用mondrian进行开发。 在压缩包中,你应该能找到mondrian源码、mondrian.properties示例、Schema XML示例、以及必要的jar包,这些是配置和运行mondrian的基础。请确保...
[Manning Publications] Mondrian 实战 英文版 [Manning Publications] Mondrian in Action E Book ☆ 出版信息:☆ [作者信息] William Back D Nicholas Goodman Julian Hyde [出版机构] Manning ...
9. **性能优化**: mondrian 4.0引入了许多性能优化,如缓存策略、查询优化器等,这些在API中都有对应的接口和配置选项。 总的来说,"mondrian-api.zip"提供的API文档对于开发者来说是一份宝贵的资源,可以帮助他们...
mondrian-oracle实例详解 Mondrian是一款开源的多维数据集(OLAP)引擎,它主要用于构建在线分析处理(OLAP)系统。Mondrian与数据库系统如Oracle结合使用,能够提供高效的数据分析和决策支持功能。在这个"Mondrian...
2. 兼容性:Mondrian与其他开源BI工具如JasperReports、BIRT等有良好的兼容性,方便报表集成和导出。 3. 版本升级:随着Mondrian的版本更新,开发人员应注意兼容性问题,适时进行版本升级以利用新特性。 总结,...
自已刚开始学mondrian,里面有两个文件,一个是mondrian自带的一个演示示例,是基于oracle实现的过程。还有一个是eclipse中配置mondrian源代码的过程。都是我自己总结的,原创。QQ:6855957
**Mondrian实例详解** Mondrian是一款开源的在线分析...这将有助于提升你在数据驱动决策和商业智能方面的技能。记住,实践是掌握知识的关键,尝试运行提供的`mondrian_test`文件,亲自体验一下Mondrian的强大功能吧。
Mondrian 源码分析和改造设计 Mondrian 源码分析和改造设计是 OLAP(Online Analytical Processing,联机分析处理)服务器的源码分析和改造设计。Mondrian 是一个基于 Java 的开源 OLAP 服务器,提供了多维数据分析...
压缩包中的"如何将Mondrian用于web项目.ppt"文件可能包含将mondrian集成到Web应用程序的具体步骤和技术,这对于开发人员来说非常有价值。"ROLAP的概念.ppt"和"MDX的基本语法及概念.ppt"则深入讲解了这些关键概念。...
- `hasAll` 属性表示是否有一个汇总层级(通常为 “All”)。 - `allMemberName` 属性指定汇总层级的名称。 - `primaryKey` 属性指定维度表中的主键字段。 - `<Table>` 元素指定维度表的名称。 - `<Level>` ...
1. **模式文件**:Mondrian通过模式文件来定义数据源、立方体、维度和度量等,这有助于管理和优化多维数据的组织结构。 2. **度量**:度量是立方体中的数值指标,用于衡量特定业务指标,如销售额、利润等。 3. **...
在 mondrian-war-maven-project 中,开发者选择Maven作为构建工具,是因为Maven有强大的依赖管理功能,能够自动下载项目所需的库文件,包括mondrian自身及其依赖项。此外,Maven的生命周期和插件机制使得构建WAR文件...
【Mondrian是什么】 Mondrian是一个开源的Java实现的在线分析处理(OLAP)引擎。它使用多维表达式(MDX)语言来查询数据,这些数据来源于关系数据库管理系统(RDBMS)。Mondrian的设计允许开发者将其轻松地集成到...
mondrian的源码组织成多个包,每个包都有特定的功能。例如,`mondrian.schema`包含了Schema的定义和管理;`mondrian.calc`处理计算逻辑;`mondrian.olap`实现了MDX解析和函数库;`mondrian.rolap`专注于关系到多维...
Mondrian OLAP引擎是开源商业智能分析的一个重要工具,它支持多维数据分析和商业智能应用。OLAP(Online Analytical Processing,联机分析处理)是一种技术,允许用户对业务数据进行复杂的查询和分析,这些数据可以...
mondrian 模式深入理解 mondrian 模式是 OLAP(在线分析处理)系统的核心组件,主要用于构建和管理多维数据库。它允许用户通过 MDX(多维表达式)查询语言进行复杂的数据分析和报告。mondrian 模式文件是描述这种...
mondrian 是一个开源的在线分析处理(OLAP)引擎,用于商业智能和数据仓库系统。它的源码提供了深入了解OLAP工作原理以及如何构建和定制OLAP解决方案的机会。在这个压缩包中,我们主要关注mondrian的引擎部分,以及...