Mondrian:
蒙德里安,OLAP核心引擎,负责从关系数据库中计算、缓存数据,响应来自表现层的使用MDX语法的查询。在这一层要做的事情就是定义一个schema元模型,包括 维度(Dimensions), 层次(Hierarchies),级别(Levels),和成员(Members)等。Mondrian要根据它来从关系数据库中聚合数据响应MDX语法的查询。
<!--[if !supportLists]--> <!--[endif]-->JPivot:
OLAP JSP custom tag library。JSP标签库。它提供OLAP Navigator与多维数据的显示,并支持图表生成PDF文件和导出Excel,是Mondrian的御用表现层。
JPivot不能单独使用,根据其主页上的描述,JPivot is a JSP custom tag library that renders an OLAP table and let users perform typical OLAP navigations like slice and dice, drill down and roll up. It uses Mondrian as its OLAP Server. JPivot also supports XMLA datasource access.
换句话说,它必须使用一个OLAP的服务器做后台,大多数选择Mondrian,当然,JPivot也支持XMLA的数据源。要使用JPivot就必须使用多维数据表。
JPivot在展示向上可以执行典型的OLAP操作,如切片、切块、上钻、下钻等。编程实现也是比较方便的。因为,JPivot是一个JSP custom tag,只要指定数据源和写一个xml的描述文件就可以了,它本身是很简单。
5.2 架构:
<!--[if !vml]--><!--[endif]-->
Mondrian面向ROLAP包含4层:表示层、计算层、聚集层、存储层。
● 表示层:指最终呈现在用户显示器上的以及与用户之间的交互,有许多方法来展现多维数据,包括数据透视表、饼、柱、线状图。
● 计算层:分析、验证、执行MDX查询。
● 聚集层:一个聚集指内存中一组计算值(cell),这些值通过维列来限制。计算层发送单元请求,如果请求不在缓存中,或者不能通过旋转聚集导出的话,那么聚集层向存储层发送请求。聚合层是一个数据缓冲层,从数据库来的单元数据,聚合后提供给计算层。聚合层的主要作用是提高系统的性能。
● 存储层:提供聚集单元数据和维表的成员。包括三种需要存储的数据,分别是事实数据、聚集和维。
JPivot架构使用XML/ XSLT渲染OLAP报表 。JPivot 使用 WCF (Web Component Framework) ,基于XML/XSLT来渲染Web UI组件。这使它显得十分另类。不过,OLAP报表这种非常复杂但又有规律可循的东西,最适合使用XSLT来渲染。但Transform Engine这时候的确能比Template Engine(Velocity,Freemarker)更高效的处理OLAP报表及其导航系统的显示。完全基于JSP+TagLib JPivot另外一个可能使人不习惯的地方是它完全基于taglib而不是大家熟悉的MVC模式。但如果不基于tabLib,基于任何MVC框架都会使其失去通用性,担不起Mondrain唯一表现层的重任,而且,MVC其实不一定需要那些框架。
5.3 JPivot+Mondrian典型的开发流程及模式:
5.3.1 数据库结构定义成Schema
schema元模型包括维度(Dimensions)、层次(Hierarchies)、级别(Levels)、和成员(Members)等。Mondrian要根据它来从关系数据库中聚合数据响应MDX语法的查询。可以说Schema文件是Jpivot+Mondrian架构应用中最核心,最关键的文件。PAS JPivot+Mondrian Demo的/WebRoot/Web-Inf/pasmondrian.xml文件就是基于XML的,用于映射OLAP的数据库结构,以供Mondrian服务器响应MDX语句查询的Schema元模型文件。Schema元模型的定义文件较复杂。幸运的是有开源工具CubeDesigner可以帮我们生成该文件,虽然该工具刚推出不久,并不成熟、稳定,还有许多BUG存在,但它至少可以生成一个大致的文件框架,可以大大减轻工作量。
基于XML的Schema元模型定义文件的主要元素及其相关属性,可参考Mondrian文档。
5.3.2 编写MDX查询语句
在Demo的/WebRoot/Web-Inf/queries/pasmondrian.jsp文件中,使用JPivot的<jp:mondrianQuery>标签定义一个MDX查询语句,代码如下:
<jp:mondrianQuery id="query01" jdbcDriver="sun.jdbc.odbc.JdbcOdbcDriver"
jdbcUrl="jdbc:odbc:jmpas"
jdbcUser="sa"
jdbcPassword="sa"
catalogUri="/WEB-INF/pasmondrian.xml">
select {[Measures].[zbz]} ON COLUMNS,{([jgmc].[All jgmc],[zbmc].[All zbmc])} ON ROWS from pas
where [tjrq.tjrq].[All tjrq]
</jp:mondrianQuery>
<jp:mondrianQuery>标签及其属性,可参考JPivot文档。
5.3.3 编写OLAP展现页面
在Demo的/WebRoot/pasmondrian.jsp利用JPivot及WCF一系列JSP标签展现Mondrian服务器返回的OLAP数据集。
具体代码参见DEMO相关文件;JPivot及WCF标签用法参考相关文档。
5.3.4 程序典型流程
1、用户发出 pasmodrian.jsp?query= pasmodrian的请求
2,pasmodrian.jsp上的<wcf:include>根据query参数,匹配/WEB-INF/query/下的pasmodrian.jsp来获取数据
3,pasmodrian.jsp上的<jp:mondrianQuery id="query01">查询数据,放入到query01变量中
4,pasmodrian.jsp上的<jp:table id="table01" query="#{query01}"/>根据query01的结果(领域数据)准备显示OLAP表格所需的数据(显示数据)
5,pasmodrian.jsp上的<wcf:render ref="table01" xslUri="/WEB-INF/jpivot/table/mdxtable.xsl"/>根据table01的结果,使用xsl,渲染出OLAP表格。
6,循环第4,5步,使用<jp:navigator>等tag准备navigator,chart的数据然后用<wcf>渲染出图表和导航系统.
整个流程,第2步的pasmodrian充当Controller调用第3步的Model层,然后第4,5步执行从领域数据(比如一些java bean)中转换出格式整齐的,需要显示的数据(比如一段xml),再用xsl将其渲染为最终的表现形式。
5.4 优点
1、基于JSP Tag的展现层,不需要安装任何插件即可运行;
2、可以轻易集成到 web 项目中。
5.5 缺点
1、没有完善的帮助文档、开发手册和错误指南,遇到问题不能迅速解决;
2、不支持SQL直接查询,需要编写MDX语句及Schema元模型定义文件,要求程序员对OLAP数据模型及数据仓库思想、理论的认识较高,学习成本高;需要相当高的熟练度才能达到快速开发的目的。
3、相关开发工具(如:报表生成器、可视化的多维报表开发工具等)缺乏,基本上处于代码级的开发;
5.6 结论
JPivot+Mondrian架构,由olap核心引擎响应来自JPivot表现层的MDX语法查询,返回多维查询结果,最终由JPivot展现多维数据。功能相当单一。JPivot和Mondrian项目均处在成长的阶段,在开发工具、文档及技术支持等方面做得还不够。程序员需要花费相当的学习成本才能获得快速开发的能力。综上,我个人不建议应用JPivot+Mondrian组合进行开发工作。不妨,将目光投向一些开源BI项目的集大成者,如Jasper、SpagoBI、Pentaho、OpenI。