﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-努力创造未来！-随笔分类-BI</title><link>http://www.blogjava.net/pdw2009/category/30867.html</link><description>J2EE相关应用技术日志</description><language>zh-cn</language><lastBuildDate>Thu, 17 Apr 2008 05:37:14 GMT</lastBuildDate><pubDate>Thu, 17 Apr 2008 05:37:14 GMT</pubDate><ttl>60</ttl><item><title>java开源的OLAP引擎--mondrian</title><link>http://www.blogjava.net/pdw2009/archive/2008/04/17/193728.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Thu, 17 Apr 2008 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2008/04/17/193728.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/193728.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2008/04/17/193728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/193728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/193728.html</trackback:ping><description><![CDATA[<span id="ArticleContent1_ArticleContent1_lblContent">&nbsp;
<p style="margin: 12pt 0cm 3.2pt"><span style="font-family: 宋体"><strong>一、引言</strong></span></p>
<p style="margin: 0cm 0cm 0pt">Mondrian, <span style="font-family: 宋体">蒙得里安&#183;皮特</span>1872-1944<span style="font-family: 宋体">荷兰画家，作品以交错的三原色为基色的垂直线条和平面为特点，他的著作包括</span> <span style="font-family: 宋体">新造型主义</span>(1920<span style="font-family: 宋体">年），对抽象艺术的发展曾经产生很深影响。——金山词霸如是说。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">不过</span>,<span style="font-family: 宋体">本文所要讨论的可不是这位艺术家。那到底</span>mondrian<span style="font-family: 宋体">是什么呢？</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">Mondrian</span><span style="font-family: 宋体">是一个开源项目。一个用Java写成的OLAP（在线分析性处理）引擎。它用MDX语言实现查询，从关系数据库(RDBMS)中读取数据。然后经过Java API用多维的方式对结果进行展示。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">我们都知道，在线分析处理(OLAP)要实时地分析大量数据。&#8220;online&#8221;这个词的含义就是即使相关的数据量是巨大的——可能以GB为单位——系统也要足够快的响应以显示结果。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">OLAP</span><span style="font-family: 宋体">用了多维分析的技术。尽管关系型数据库所存储的所有数据都是以行和列的形式存在的，但一个多维数据集还是可以由轴(axes)和单元(cell)组成。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp; <img height="346" alt="" src="http://www.blogjava.net/images/blogjava_net/pdw2009/abc.jpg" width="448" border="0" /></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">在上面的例子中，时间是个维度（</span>dimension<span style="font-family: 宋体">），而它下面的层次（</span>Hierarchies<span style="font-family: 宋体">）又分为半年、季度等级别(Level)。</span></p>
<p style="margin: 12pt 0cm 3.2pt"><span style="font-family: 宋体"><strong>二、感性认识——运行一个小实例</strong></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">我们暂时先不讨论Mondrian所用到的一些技术。我们可以先从一个小例子开始，不必在意每个细节，只是希望大家有个感性认识先。在实施这个例子的过程中，或许读者就能见些端倪。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">首先应该到<a href="http://sourceforge.net/projects/mondrian/"><font color="#00008b">http://sourceforge.net/projects/mondrian/</font></a>下载mondrian的最新版本。这是一个zip包，包括我们要用到的lib和一个例子。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">当然，读者完全可以运行mondrian自带的实例，不过这个例子有些纷繁复杂，除了Mondrian本身还有其它技术在里面，不大容易讲清楚，也不太适合初学者学习。所以，笔者在这里设计一个简洁干净的最小化实例。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">本文所阐述的实例环境是Windows2000+Tomcat+Oracle。并且认为读者已经针对jdk和Tomcat做了正确的开发环境的设置。</span></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">1</font><span style="font-family: 黑体">准备工作</span></p>
<p style="margin: 0cm 0cm 0pt"><code><span style="color: #333333"><font face="宋体">在%Tomcat%"webapp"依次建立mywebapp，mywebapp"WEB-INF，mywebapp"WEB-INF"lib,把</font></span></code></p>
<p style="margin: 0cm 0cm 0pt"><code><span style="color: #333333"><font face="宋体">mondrian.war"WEB-INF"lib"mondrian.jar,javacup.jar,</font></span></code> x<font face="宋体"><code><span style="color: #333333">alan.jar,junit.jar</span></code><code><span style="color: #333333">等相关的jar包copy到</span></code><span style="color: #333333; font-family: 宋体">%</span><code><span style="color: #333333">TOMCAT_HOME%</span></code><code><span style="color: #333333">"webapps"mywebapp"lib"</span></code><code><span style="color: #333333">下。</span></code></font></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">2</font><span style="font-family: 黑体">数据库结构</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">在这个tiny的系统中，数据库有3个表tb_employee（职员表）,tb_time（时间表）,tb_salary（薪酬表）。表结构如下：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">drop table tb_employee;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">create table tb_employee</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">(</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; employee_id&nbsp;&nbsp;&nbsp;&nbsp; number,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --</span><span style="font-family: 宋体">职员id&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; employee_name&nbsp;&nbsp; varchar2(10)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --</span><span style="font-family: 宋体">职员姓名</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">drop table tb_time;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">create table tb_time</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">(</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; time_id&nbsp;&nbsp; number,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --</span><span style="font-family: 宋体">时间id</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; the_year&nbsp;char(4),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --</span><span style="font-family: 宋体">年</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; the_month char(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --</span><span style="font-family: 宋体">月</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">drop table tb_salary;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">create&nbsp;table tb_salary</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">(</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; employee_id&nbsp;number,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --</span><span style="font-family: 宋体">职员id&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; time_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --</span><span style="font-family: 宋体">时间id</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; salary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number(19,4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --</span><span style="font-family: 宋体">薪酬</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">当然，为了使系统能够运行，还需要读者向数据库表中插入一些数据。</span></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">3</font><span style="font-family: 黑体">根据数据库表的结构，书写</span><font face="Arial">schema</font><span style="font-family: 黑体">文件</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&lt;?xml version="1.0"?&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&lt;Schema name="Mondrian"&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&lt;Cube name="CubeTest"&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;Table name="TB_SALARY" /&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;Dimension name="Employee"&nbsp;foreignKey="EMPLOYEE_ID" &gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Hierarchy hasAll="true" primaryKey="EMPLOYEE_ID"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Table name="TB_EMPLOYEE" /&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Level name="employeeId" column="EMPLOYEE_ID"&nbsp;&nbsp; uniqueMembers="true" &gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Property name="employeeName" column="EMPLOYEE_NAME"/&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Level&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Hierarchy&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/Dimension&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;Dimension name="Time" foreignKey="TIME_ID" &gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;Hierarchy&nbsp;hasAll="false" primaryKey="TIME_ID" &gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Table name="TB_TIME" /&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Level name="year" column="THE_YEAR" uniqueMembers="false" /&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Level name="month" column="THE_MONTH" uniqueMembers="false" /&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Hierarchy&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/Dimension&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;Measure name="Salary" column="SALARY" aggregator="sum" /&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/Cube&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&lt;/Schema&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">文件路径为mywebapp"WEB-INF"mondriantest.xml</span></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">4</font><span style="font-family: 黑体">利用</span><font face="Arial">MDX</font><span style="font-family: 黑体">查询</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">mywebapp"mondriantest.jsp</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">1 &lt;%@ page import="mondrian.olap.*"%&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&lt;%</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">2 Connection connection = </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;DriverManager.getConnection</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 5.25pt"><span style="font-family: 宋体">("Provider=mondrian;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;Jdbc=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:dbname; </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 5.25pt"><span style="font-family: 宋体">JdbcUser=dbuser;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;JdbcPassword=dbpasswd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 5.25pt"><span style="font-family: 宋体">Catalog=file:///c:/Tomcat4.1/webapps/mywebapp/WEB-INF/mondriantest.xml; </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 5.25pt"><span style="font-family: 宋体">JdbcDrivers=oracle.jdbc.driver.OracleDriver;",null,false);&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">3 String queryStr=</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36.75pt"><span style="font-family: 宋体">"select {[Measures].[Salary]} ON COLUMNS,</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 73.5pt"><span style="font-family: 宋体">{[Employee].[employeeId].Members} ON ROWS </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 42pt"><span style="font-family: 宋体">from CubeTest "; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">4 Query query =connection.parseQuery(queryStr);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">5 Result result = connection.execute(query);</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">out.println("get result");</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">%&gt;</span></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">5</font><span style="font-family: 黑体">运行</span></p>
<p style="margin: 0cm 0cm 0pt"><font face="宋体"><code><span style="color: #333333">这时启动to</span></code><code>mcat,</code><code>在浏览器地址栏中输入</code></font></p>
<p style="margin: 0cm 0cm 0pt"><a href="http://localhost:8080/mywebapp/test.jsp"><font color="#00008b"><span style="font-family: 宋体">http://localhost:8080/mywebapp/ mondriantest<span style="font-family: 宋体">.jsp</font></a></span></span><code><span style="color: #333333"><font face="宋体">即可。</font></span></code></p>
<p style="margin: 12pt 0cm 3.2pt"><span style="font-family: 宋体"><strong>三、深入探讨</strong></span></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">3</font><span style="font-family: 黑体">．</span><font face="Arial">1 API</font></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">mondrian</span><span style="font-family: 宋体">为客户端应用程序提供了API接口以进行查询。&nbsp;而这些API对于任何用过JDBC的人都会觉得似曾相识的。主要的不同点是查询语言的不同：Mondrian用的是MDX</span>('Multi-Dimensional eXpressions'),<span style="font-family: 宋体">而</span>JDBC<span style="font-family: 宋体">则用的是</span>SQL<span style="font-family: 宋体">。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">和</span>JDBC<span style="font-family: 宋体">一样，也是要经过建立连接，形成查询语句，执行查询得到结果集等几个步骤的。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">我们来看看</span><span style="font-family: 宋体">mondriantest.jsp</span><span style="font-family: 宋体">的代码</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">第1行：import mondrian.olap.*</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">这是引入我们所需的类，下面要用到的DriverManager、Connection、Query、Result都在这个package内。这个package一般位于mondrian.jar中。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">第2行：Connection connection = </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;DriverManager.getConnection</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 5.25pt"><span style="font-family: 宋体">("Provider=mondrian;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;Jdbc=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:dbname; </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 5.25pt"><span style="font-family: 宋体">JdbcUser=dbuser;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;JdbcPassword=dbpasswd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 5.25pt"><span style="font-family: 宋体">Catalog=file:///c:/Tomcat4.1/webapps/mywebapp/WEB-INF/mondriantest.xml; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">JdbcDrivers=oracle.jdbc.driver.OracleDriver;",null,false);&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">通过DriverManager创建一个Connection的实例，建立起数据库连接。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">其中Jdbc=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:dbname; 是设置数据库的ip和库名。JdbcUser=dbuser;&nbsp;设置数据库用户。JdbcPassword=dbpasswd;&nbsp;&nbsp; 设置用户密码。而</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 5.25pt"><span style="font-family: 宋体">Catalog=file:///c:/Tomcat4.1/webapps/mywebapp/WEB-INF/mondriantest.xml; </span><span style="font-family: 宋体">就是设置MDX语句查询要对应的schema文件的路径</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">第3行：String queryStr=</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36.75pt"><span style="font-family: 宋体">"select {[Measures].[Salary]} ON COLUMNS,</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 73.5pt"><span style="font-family: 宋体">{[Employee].[employeeId].Members} ON ROWS </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 42pt"><span style="font-family: 宋体">from CubeTest "; </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">形成MDX的查询语句。MDX语句的形式和schema文件的设定是密切相关的，当然schema文件的形成也是由数据库结构决定的。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">第4行：Query query =connection.parseQuery(queryStr);对MDX语句进行分析处理，是否符合schema文件定义、数据库结构和数据库数据。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">第5行：Result result = connection.execute(query);执行查询，得到结果集。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">我们发现Query类似于JDBC的Statement,而Result则酷似于ResultSet。</span></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">3</font><span style="font-family: 黑体">．</span><font face="Arial">2 schema</font></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">3</font><span style="font-family: 黑体">．</span><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">1</font><span style="font-family: 黑体">什么是</span><font face="Arial">schema</font></p>
<p style="margin: 0cm 0cm 0pt">schema<span style="font-family: 宋体">定义了一个多维数据库。包含了一个逻辑模型，而这个逻辑模型的目的是为了书写</span>MDX<span style="font-family: 宋体">语言的查询语句。这个逻辑模型实际上提供了这几个概念：</span>Cubes,<span style="font-family: 宋体">维度（</span>Dimensions<span style="font-family: 宋体">），</span> <span style="font-family: 宋体">层次（</span>Hierarchies<span style="font-family: 宋体">），级别（</span>Levels<span style="font-family: 宋体">），和成员（</span>Members<span style="font-family: 宋体">）。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">而</span>schema<span style="font-family: 宋体">文件就是编辑这个</span>schema<span style="font-family: 宋体">的一个</span>xml<span style="font-family: 宋体">文件。在这个文件中形成逻辑模型和数据库物理模型的对应。</span></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">3</font><span style="font-family: 黑体">．</span><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">2 schema</font><span style="font-family: 黑体">的逻辑结构</span></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">3</font><span style="font-family: 黑体">．</span><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">1 Cube</font></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">一个</span>Cube<span style="font-family: 宋体">是一系列维度</span>(Dimension)<span style="font-family: 宋体">和度量</span>(Measure)<span style="font-family: 宋体">的集合区域。在</span>Cube<span style="font-family: 宋体">中，</span>Dimension<span style="font-family: 宋体">和</span>Measure<span style="font-family: 宋体">的共同地方就是共用一个事实表。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">例：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&lt;Cube name="CubeTest"&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;Table name="TB_SALARY" /&gt;</span></p>
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp; &#8230;&#8230;.</p>
<p style="margin: 0cm 0cm 0pt">&lt;/Cube&gt;</p>
<p style="margin: 0cm 0cm 0pt">&lt;Table&gt;<span style="font-family: 宋体">标签确定了所用的事实表的表名。</span></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">3</font><span style="font-family: 黑体">．</span><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">2 Measure</font></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">一个度量，简单的说，就是要被计算的值。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">例：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&lt;Measure name="Salary" column="SALARY" aggregator="sum" /&gt;</span></p>
<p style="margin: 0cm 0cm 0pt">&lt;Measure&gt;<span style="font-family: 宋体">标签有</span>3<span style="font-family: 宋体">个必要的属性</span>name<span style="font-family: 宋体">（度量名），</span>column<span style="font-family: 宋体">（在事实表中的字段名）</span>, aggregation<span style="font-family: 宋体">（聚合所用的方法）。</span></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">3</font><span style="font-family: 黑体">．</span><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">2</font><span style="font-family: 黑体">．</span><font face="Arial">3 Dimenesion</font></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">而维度一般有其相对应的维度表。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">例：</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&lt;Dimension name="Time" foreignKey="TIME_ID" &gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Hierarchy&nbsp;hasAll="false" primaryKey="TIME_ID" &gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Table name="TB_TIME" /&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Level name="year" column="THE_YEAR" uniqueMembers="false" /&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Level name="month" column="THE_MONTH" uniqueMembers="false" /&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Hierarchy&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&lt;/Dimension&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">一般Dimesion包含层次（Hierarchy），而hierarchy是由级别（Level）组成。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">&lt;Dimension&gt;</span><span style="font-family: 宋体">标签的foreignKey是事实表中的字段，&lt;Hierarchy&gt;标签的primaryKey是维度表中的字段，通过这种方式把事实表和维度表关联起来。&lt;Hierarchy&gt;标签下的&lt;Table&gt;标签就指明了维度表名。而若干个Level对应着维度表的若干字段。</span></p>
<p style="margin: 12pt 0cm 3.2pt"><font face="Arial">3</font><span style="font-family: 黑体">．</span><font face="Arial">3 MDX</font><span style="font-family: 黑体">语言</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">MDX</span><span style="font-family: 宋体">是为了查询多维数据的，而SQL是为了查询关系数据库的。而Mondrian所涉及到的一些MDX概念、MDX语法以及系统定义的MDX函数和微软的MDX十分接近，差别微小。完全可以参考微软的帮助文档进行学习。在此就不在赘述。MDX语言基本上已成为多维数据库查询语言的标准。</span></p>
<p style="margin: 12pt 0cm 3.2pt"><span style="font-family: 宋体"><strong>四、结语</strong></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">Mondrian</span><span style="font-family: 宋体">作为基于java的OLAP引擎，而且是开源的项目，为那些基于java的项目而要脱离微软构架但又不得不对大量数据进行分析的项目又提供了一种可行的方案。希望它也能象</span><span style="font-family: 宋体">蒙得里安&#183;皮特对抽象艺术的发展产生影响一样起到一定的作用。</span></p>
</span>
<img src ="http://www.blogjava.net/pdw2009/aggbug/193728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2008-04-17 13:29 <a href="http://www.blogjava.net/pdw2009/archive/2008/04/17/193728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BI的入门</title><link>http://www.blogjava.net/pdw2009/archive/2008/04/17/193714.html</link><dc:creator>有猫相伴的日子</dc:creator><author>有猫相伴的日子</author><pubDate>Thu, 17 Apr 2008 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/pdw2009/archive/2008/04/17/193714.html</guid><wfw:comment>http://www.blogjava.net/pdw2009/comments/193714.html</wfw:comment><comments>http://www.blogjava.net/pdw2009/archive/2008/04/17/193714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pdw2009/comments/commentRss/193714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pdw2009/services/trackbacks/193714.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近想学习BI,因为自己做的一个项目用到了大量Oracle 分析函数,而烃使用使用OLAP技术,系统目前数据量少,速度相对来说可以。每天数据量这么大，谁能保证积累了两年的数据后，运算速度还有这么快呢。这让我不得不思考我在做的项目与BI的差别，BI这概念之前只听说过没深入了解更没有用过相应的工具。一开始自己就想到开源的BI工具，就开始下载，找入门文档。两天之后让我发现这行不通，连概念都不理解，仅有工具是不行的。我们需要理解它的定义、历史、作用，才能开始学习它，才需要用过工具。<br />
1、BI的定议：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BI(Business Intelligence) 是一种运用了数据仓库、在线分析和数据挖掘等技术来处理和分析数据的崭新技术，目的是为企业决策者提供<strong style="color: #ff0000">决策支持</strong>。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 从定义上我们要明白BI运行的基础是&nbsp;：数据仓库，和联机分析 ，数据挖掘<br />
&nbsp;&nbsp;&nbsp;&nbsp; 目的：提供决策支持<br />
2、BI分类<br />
&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #99cc00">信息类 BI 应用&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">指由原始数据加工而来的<strong>数据查询</strong>、<strong>报表图表</strong>、<strong>多维分析</strong>、<strong>数据可视化</strong>等应用，这些 <br />
应用的共同特点是：将数据转换为决策者可接受的信息，展现给决策者。例如将银行交易数据加工为银行财务报表。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp; <strong>知识类 BI 应用<br />
<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">&nbsp;&nbsp;指通过数据挖掘技术和工具，将数据中隐含的关系发掘出来，利用计算机直接将数据加工为知识，展现给决策者。<br />
3、BI的应用模式<br />
&nbsp;&nbsp;&nbsp;&nbsp; A、初级模式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据查询和生成报表，这是BI的初级应用模式<br />
&nbsp;&nbsp;&nbsp;&nbsp; B、<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000">1、BI 高级应用模式<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OLAP ，即联机分析处理，是 BI 带来的一种全新的数据观察方式，是 BI 的核心技术 之一。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">&nbsp;2、数据挖掘</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong></strong>数据挖掘的目的是通过计算机对大量数据进行分析，找出数据之间潜藏的规律和知识，并以可理解的方式展现给用户。数据挖掘是最高级的 BI 应用，因为它能代替部分人脑功能。&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据挖掘的三大要素是： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>技术和算法：</strong>目前常用的数据挖掘技术包括——<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;自动类别侦测(Auto Cluster Detection)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;决策树(Decision Trees)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;神经网络(Neural Networks)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>数据：</strong>由于数据挖掘是一个在已知中挖掘未知的过程，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因此需要大量数据的积累作为数据源，数据积累<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;量越大，数据挖掘工具就会有更多的参考点。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>预测模型：</strong>也就是将需要进行数据挖掘的业务逻辑由<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;计算机模拟出来，这也是数据挖掘的主要任务。<br />
</p>
<p><strong>4、&nbsp;底座——数据仓库技术<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong></strong>数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合，用于支持管理决策。以上是数据仓库的官方定义。&nbsp;<br />
<br />
<br />
5、总结：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要想学好BI，以上知识点是基础。必须把基础学习才能深切的理解BI，理解客户在这主面真正意义上的需求。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
</span></span></p>
<img src ="http://www.blogjava.net/pdw2009/aggbug/193714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pdw2009/" target="_blank">有猫相伴的日子</a> 2008-04-17 12:55 <a href="http://www.blogjava.net/pdw2009/archive/2008/04/17/193714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>