hengheng123456789

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks

一、引言

Mondrian, 蒙得里安?皮特 1872-1944 荷兰画家,作品以交错的三原色为基色的垂直线条和平面为特点,他的著作包括 新造型主义 (1920 年),对抽象艺术的发展曾经产生很深影响。金山词霸如是说。

不过 , 本文所要讨论的可不是这位艺术家。那到底 mondrian 是什么呢?

Mondrian 是一个开源项目。一个用Java写成的OLAP(在线分析性处理)引擎。它用MDX语言实现查询,从关系数据库(RDBMS)中读取数据。然后经过Java API用多维的方式对结果进行展示。

我们都知道,在线分析处理(OLAP)要实时地分析大量数据。“online”这个词的含义就是即使相关的数据量是巨大的可能以GB为单位系统也要足够快的响应以显示结果。

OLAP 用了多维分析的技术。尽管关系型数据库所存储的所有数据都是以行和列的形式存在的,但一个多维数据集还是可以由轴(axes)和单元(cell)组成。

 

在上面的例子中,时间是个维度( dimension ),而它下面的层次( Hierarchies )又分为半年、季度等级别(Level)

二、感性认识,运行一个小实例

我们暂时先不讨论Mondrian所用到的一些技术。我们可以先从一个小例子开始,不必在意每个细节,只是希望大家有个感性认识先。在实施这个例子的过程中,或许读者就能见些端倪。

首先应该到http://sourceforge.net/projects/mondrian/下载mondrian的最新版本。这是一个zip包,包括我们要用到的lib和一个例子。

当然,读者完全可以运行mondrian自带的实例,不过这个例子有些纷繁复杂,除了Mondrian本身还有其它技术在里面,不大容易讲清楚,也不太适合初学者学习。所以,笔者在这里设计一个简洁干净的最小化实例。

本文所阐述的实例环境是Windows2000+Tomcat+Oracle。并且认为读者已经针对jdkTomcat做了正确的开发环境的设置。

2 1 准备工作

%Tomcat%/webapp依次建立mywebappmywebapp/WEB-INFmywebapp/WEB-INF/lib, mondrian.jar,javacup.jar, x alan.jar,junit.jar 等相关的jarcopy % 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.*

这是引入我们所需的类,下面要用到的DriverManagerConnectionQueryResult都在这个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类似于JDBCStatement,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 作为基于javaOLAP引擎,而且是开源的项目,为那些基于java的项目而要脱离微软构架但又不得不对大量数据进行分析的项目又提供了一种可行的方案。希望它也能象 蒙得里安?皮特对抽象艺术的发展产生影响一样起到一定的作用。

posted on 2006-12-01 16:55 哼哼 阅读(2195) 评论(3)  编辑  收藏 所属分类: BI

Feedback

# re: Pentaho之mondrian“艺术家” 2008-01-10 09:57 wdmcln@dsy
你的msn是多少,想和你交流一下?
我做的mondrian例子,不能输出结果集,没有达到网上说的那种效果!
在单步测试的时候,已经看维度里面有值,找了好久,也没找到怎么输出结果集的方法
PrintWriter pw = new PrintWriter(System.out);
result.print(pw);
这样没有任何输出,希望到得到作者的帮助!
我的msn:wdmcln@hotmail.com  回复  更多评论
  

# re: Pentaho之mondrian“艺术家” 2009-02-16 09:56 pentaho
pentaho中文社区挺不错的,里面有很多pentaho和其它商业智能产品的资料,推荐去看看,地址是www.pentahoclub.cn  回复  更多评论
  

# re: Pentaho之mondrian“艺术家” 2011-07-28 17:18 alishan212
Pentaho QQ 群, Pentaho China

Weclome to join in Pentaho Projects in China, we would like to share any experience with you and get cooperations each other.

Pentaho 项目群成立了,欢迎有识之士加入,共同讨论分享 Pentaho 经验和 项目合作。

Pentaho 项目 QQ群: 164774111
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: