在网上查了一下,发现了Mondrian。Mondrian是基于JAVA的数据仓库引擎,可以集成到web项目中,这一点最吸引我。另外与他搭配的表现层的方案也有不少选择,Jpivot是元老,pentaho,openi看起来是后起之秀。不管怎样,还是先研究一下modrian吧
网上的中文资源比较少,在csdn上找了一下,只发现了两篇比较有用的
Mondrian——有影响的“艺术家” 选择自 kswaking 的 Blog
穷人的通用OLAP方案III--JPivot表现层 选择自
calvinxiu 的 Blog
照着做了一下,发现了一些问题,也有了一些心得。
一.环境准备
1.1 首先介绍一下环境
操作系统:Linux
服务器:Tomcat 5.5
数据库:MySQL 5.0.21
1.2 下载程序。Mondrian在
http://mondrian.sourceforge.net 可以下载,最早他是用MS Analyze Service的教程中FoodMart数据库作为demo的,那个是access的数据库。还好现在他有了Platform-Independent的版本,我就下载了那个
mondrian-2.1.1-derby.zip 解压缩之后在lib目录里面有一个mondrian-embedded.war,把这个直接放到tomcat的webapps目录里面就能够看到mondrian的demo了。不过后面的测试,我把这个war解开之后放到webapps里面去,并且目录把名字改短了点mondrian。启动tomcat,在浏览器输入
http://localhost/mondiran 看到了demo。需要说明一下的是,mondrian的发布包含了Jpivot,用它来做展示层,所以不用再去单独下载Jpivot了。
1.3 数据库建表,在MySQL数据库里面建立table,借用了kswaking的数据库结构
在这个
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) --薪酬
);
当然,为了使系统能够运行,还需要读者向数据库表中插入一些数据。
二. mondrian测试
需要说明的是mondrian使用了MS一样的
MDX语言实现查询,这对于从MS Analyze Services入门的人真是一个好消息。
2.1 先编写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>
这个schema定义了一个cube,包含两个Dimension和一个Measure。很容易看懂,就不解释了。 文件路径为webapps/mondrian/
WEB-INF/queries/mondriantest.xml。
为了后面的测试方便,我把文件放到了queries目录里面。
因为用MySQL建表的时候都用小写的,所以schema里面的字段名也都用了小写(我一开始也使用大写的,结果出错,找不到字段),calvinxiu的文章说如果是Oracle数据库,这里的字段要用大写。
2.2 编写JSP
<%@ page import="mondrian.olap.*"%> <% Connection connection = DriverManager.getConnection("Provider=mondrian; Jdbc=jdbc:mysql://localhost/mondrian; JdbcUser=root; JdbcPassword=; Catalog=file:///usr/local/apache-tomcat-5.5.12/webapps/mondrian/WEB-INF/queries/mondriantest.xml; JdbcDriver=com.mysql.jdbc.Driver", null, false);
String querystr = " select {[Measures].[Salary]} ON COLUMNS, {[Employee].[employeeId].Members} ON ROWS from CubeTest ";
Query query=connection.parseQuery(querystr); Result result = connection.execute(query); out.println("get result"); %>
可以看到mondrian也使用jdbc来连接数据库的,其中要特别注意的是Catalog指名了schema的位置。
文件路径webapps/mondrian/mondriantestmdx.jsp
2.3 测试
在浏览器输入http://localhost/mondrian/mondriantestmdx.jsp 可以看到显示的结果 get result,说明一切正常。
到目前为止,我们只测试了Mondrian,它只负责数据的提取和组织,所以在画面上没有看到任何的数据,下一篇文章将继续研究数据的展现 - Jpivot。