数据仓库解决方案
数据仓库解决方案
http://dev.csdn.net/develop/article/31/31791.shtm Mondrian——有影响的“艺术家” 选择自 kswaking 的 Blog
http://dev.csdn.net/develop/article/68/68661.shtm 穷人的通用 OLAP 方案 III--JPivot 表现层 选择自 calvinxiu 的 Blog
一.环境准备
1.1 首先介绍一下环境
操作系统:Ubuntu6.06
服务器:Tomcat 5.5.17
数据库: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 目录里面有一个 mondrianembedded.war,把这个直接放到 tomcat 的 webapps 目录里面就能够看到 mondrian demo 了。不过后面的测试,我把这个 war 解开之后放到 webapps 里面去,并且目录把名字改短了点 mondrian。启动 tomcat,在浏览器输入 http://localhost/mondiran 看到了 demo。
*需要说明一下的是,mondrian 的发布包含了 Jpivot,用它来做展示层,所以不用再去单独下载 Jpivot 了。
1.3 数据库建表
在 MySQL 数据库里面建立 table,在这个 tiny 的系统中,数据库有 3 个表 tb_employee(职员表),tb_time(时间表),tb_salary(薪酬表)。表结构如下:
drop table tb_employee;
create table tb_employee
(
employee_id int, --职员 id
employee_name varchar2(10) --职员姓名
);
drop table tb_time;
create table tb_time
(
time_id int, --时间 id
the_year char(4), --年
the_month char(2) --月
);
drop table tb_salary;
create table tb_salary
(
employee_id int, --职员 id
time_id int, --时间 id
salary int --薪酬
);
当然,为了使系统能够运行,还需要读者向数据库表中插入一些数据。
二. 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,它只负责数据的提取和组织,所以在画面上没有看到任何的数据。
*注意:在运行的时候,可能会出错,这是因为项目的驱动不全,缺少mysql的驱动,去下载
mysql-connector-java-5.0.3-bin.jar这个驱动,然后放在webapps/lib/下就可以了。此实例在windows(win2k)、linux (ubuntu)下都可以运行。
三.数据的展现-----JPivot
上面研究了用 Mondrian 研究和提取数据,现在要研究如何展现数据了。先从最基础的JPivot 开始,JPivot 可以说是 Mondrian 的姊妹项目,是基于 Java 的数据仓库表现层工具。这个项目的主页在 http//jpivot.sourceforge.net/,那里除了 JPvoit之外,还有一个比较有用的东西,据说是 Mondrian 的 EClipse 插件,上面我是手工撰写 schema 的,这个插件应该有类似 MS 的图形化设计界面吧,以后再研究这个插件吧,言归正传,今天研究的主题是 JPivot。
首先注意到两个要点:
JPivot 使用 WCF (Web Component Framework) ,基于 XML/XSLT 来渲染Web UI组件。
JPivot 是完全基于 taglib 的。
3.1. 寻找突破口
从哪里开始呢,当然是先从 demo 入手了,在浏览器里面打开 demo,点击其中的例子,发现他们指向的链接是
http://localhost/mondrian/testpage.jsp?query=mondiran
http://localhost/mondrian/testpage.jsp?query=xmla
http://localhost/mondrian/testpage.jsp?query=fourthier
这下比较清楚目标了,先研究一下 testpage.jsp 吧。
3.2. testpage.jsp 研究
在 testpage.jsp 中,比较重要的一段是
<%-- include query and title, so this jsp may be used with different queries --%>
<wcf:include id="include01" httpParam="query" prefix="/WEB-INF/queries/" suffix=".jsp"/>
<c:if test="${query01 == null}">
<jsp:forward page="/index.jsp"/>
</c:if>
<%-- define table, navigator and forms --%>
<jp:table id="table01" query="#{query01}"/>
其中<wcf:include id="include01" httpParam="query" prefix="/WEB-INF/queries/" suffix=".jsp"/>取得参数 query 的值,并且匹配位置在/WEB-INF/queries/,扩展名是 jsp 的文件。
另一句<jp:table id="table01" query="#{query01}"/>指明了 query 的名称是query01。
注意这两个 query 是不一样的,wcf 的 query 是 http 的参数名称叫做 query,而 jp 的query是 mondrian 的 query 对象。在 testpage.jsp 的后面还定义了 form,navigator,chart 等等,这里先不做深入研了。
3.3.mondrian.jsp 研究
下面看看 testpage.jsp 用到的 mondrian.jsp,打开/WEB-INF/queries/mondrian.jsp,哈哈,真是似曾相识啊。这里定义了 mondrian 的query,它的 id 是 query01,还有 jdbc 的相关信息。以及这个 query 对应的 mdx 查询select 语句。再打开 xmla.jsp 发现也是同样的结构,这样就比较清楚了。下面就可以依葫芦画瓢,进行我们的测试了。
3.4.测试
首先写一个 mondriantest.jsp 放在/WEB-INF/queries 目录
<%@ page session="true" contentType="text/html; charset=ISO-8859-1" %>
<%@ 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/mondrian" catalogUri="/WEB-
INF/queries/mondriantest.xml"
jdbcUser="root" jdbcPassword="" connectionPooling="false">
select {[Measures].[Salary]} ON COLUMNS,
{[Employee].[employeeId].Members} ON ROWS from CubeTest
</jp:mondrianQuery>
<c:set var="title01" scope="session">Test Query uses Mondrian
OLAP</c:set>
这里用到的 mondriantest.xml 就是上面写的那个。然后在浏览器地址栏输入
http://localhost/mondrian/testpage.jsp?query=mondriantest,大功告成,看到我们期望的画面了。
没有评论:
发表评论