热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mondrian简介

出自:https:www.cnblogs.comlk-fxtxp7067720.html一、Mondrian简介Mondrian是一个开源项目。一个用Java写成

出自:https://www.cnblogs.com/lk-fxtx/p/7067720.html

一、  Mondrian简介

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

Mondrian的使用方式同JDBC驱动类似。可以非常方便的与现有的Web项目集成


1.1 Mondrian的体系结构(Architecture)

Mondrian OLAP 系统由四个层组成; 从最终用户到数据中心, 顺序为: 
1.1.1 表现层(the presentation layer)
1.1.2 维度层(the dimensional layer)
1.1.3 集合层(the star layer)
1.1.4 存储层(the storage layer)
结构图如下:

 

 


1.1.1 表现层(the presentation layer)

表现层决定了最终用户将在他们的显示器上看到什么, 及他们如何同系统产生交互。

有许多方法可以用来向用户显示多维数据集, 有 pivot 表 (一种交互式的表), pie, line 和图表(bar charts)。它们可以用Swing 或 JSP来实现。

表现层以多维"文法(grammar)(维、度量、单元)”的形式发出查询,然后OLAP服务器返回结果。

1.1.1.1 Jpivot表现层

JPivot 是Mondrian的表现层TagLib,一直保持着良好的开发进度。

您可以通过访问jpivot的官方网站http://jpivot.sourceforge.net/以获得更多的帮助及支持

jpivot使用XML/ XSLT渲染OLAP报表:

JPivot 使用 WCF (Web Component Framework)  ,基于XML/XSLT来渲染Web UI组件。这使它显得十分另类。不过,OLAP报表这种非常复杂但又有规律可循的东西,最适合使用XSLT来渲染。

jpivot完全基于JSP+TagLib:

JPivot另外一个可能使人不惯的地方是它完全基于taglib而不是大家熟悉的MVC模式。

但它可以很方便的将多维数据展示给最终用户,如下表格:

 

 

jpivot其实是一个自定义jsp的标签库。它基于XML/XSLT配置来生成相应的html。所幸的是,我们并不需要了解太多关于这方面的内容,我们只要掌握相应jsp标签的使用即可。

在本教程的实例中,我们将会对一些常用到的jpivot标签进行讲解。

您还可以通过汉化WEB-INF/jpivot下的xml文件来完成对jpivot的汉化工作


1.1.2 维度层(the dimensional layer)

维度层用来解析、验证和执行MDX查询要求。

一个MDX查询要通过几个阶段来完成:首先是计算坐标轴(axes),再者计算坐标轴axes 中cell的值。

 为了提高效率,维度层把要求查询的单元成批发送到集合层,查询转换器接受操作现有查询的请求,而不是对每个请求都建立一个MDX 声明。


1.1.3 集合层(the star layer)

集合层负责维护和创建集合缓存,一个集合是在内存中缓存一组单元值, 这些单元值由一组维的值来确定。

维度层对这些单元发出查询请求,如果所查询的单元值不在缓存中,则集合管理器(aggregation manager)会向存储层发出查询请求


1.1.4 存储层(the storage layer)

存储层是一个关系型数据库(RDBMS)。它负责创建集合的单元数据,和提供维表的成员。


1.2 API

Mondrian 为客户端提供一个用于查询的API

因为到目前为止,并没有一个通用的用于OLAP查询的API,因此Mondrian提供了它私有的API.

尽管如此,一个常使用JDBC的人将同样发现它很熟悉.不同之处仅在于它使用的是MDX查询语言,而非SQL

下面的java片段展示了如何连接到Mondrian,然后执行一个查询,最后打印结果.

[java] view plaincopy


  1. import mondrian.olap.*;  
  2.     import java.io.PrintWriter;  
  3.     Connection connection = DriverManager.getConnection("Provider=mondrian;"   
  4.             +"Jdbc=jdbc:odbc:MondrianFoodMart;"   
  5.             +"Catalog=/WEB-INF/FoodMart.xml;",null,false);  
  6.     Query query = connection.parseQuery("SELECT {[Measures].[Unit Sales], [Measures].[Store Sales]} on columns,"   
  7.             +" {[Product].children} on rows "   
  8.             +"FROM [Sales] " +"WHERE ([Time].[1997].[Q1], [Store].[CA].[San Francisco])");  
  9.     Result result = connection.execute(query);  
  10. 10.     result.print(new PrintWriter(System.out));  

与JDBC类似,一个Connection由DriverManager创建,Query 对象类似于JDBC 的Statement,它通过传递一个MDX语句来创建.Result对象类似于JDBC的ResultSet,只不过它里面保存的是多维数据

您可以通过查看Mondrian帮助文档里的javadoc来获取更多关于Mondrian API的资料

通过上面的介绍,您应该对mondrian的体系有一个基本的了解。

Mondrian安装完成后,便可直接使用自带的Derby数据库中的数据进行测试和学习。

我们看一个最简单的MDX语句:

select

{

[Measures].[Unit Sales],

[Measures].[Store Cost],

[Measures].[Store Sales]

} ON COLUMNS,

{(

[Promotion Media].[All Media],

[Product].[All Products]

)} ON ROWS

from [Sales]

where [Time].[1997]

 

其中,SELECT 后跟着的是测量指和维度,[Measures]是指测量值,也就是报表中的指标,[Promotion Media]、[Product]、[Time]是指维度,也就是我们需要挖掘的维度。我们发现,WHERE后面也是跟着维度的,代表从维度中过滤出一些数据。

FROM后面跟着的是立方体,[Sales]是我们OLAP中建立的数据立方体。

好了,我们一步步看看这个DMX语句后面配置的Schema吧,Schema这个怎么翻译好呢,我估计协议比较妥当,因为它就只是XML定义的协议。

 

首先,看from后跟的数据立方体,Sales

    

    

 

 

 

 

 

看完以上Schema的协议定义,我们就可以把这个例子需要的协议文件最小化了,在${apache-tomcat-7.0.29}\webapps\mondrian\WEB-INF\queries\目录下新建一个XML文件TestSchema.xml,内容如下:

 

 


1.3 下载与发布

下载地址:https://sourceforge.net/projects/mondrian/?source=typ_redirect

点击files 里面有Mondrian的各种版本,其中mondrian-3.14.0是最新版本,mondrian-3.12.0是稳定版本。下载完成后就其解压,有2种部署方法。

 

 

第一种方法:在解压后的文件中找到lib,打开里面有一个mondrian.war文件,将其直接扔到tomcat的webapps目录下,然后启动Tomcat,自动解压。打开浏览器输入localhost:8080/mondrian 出现欢迎界面说明部署成功。

第一种方法:利用常用的ida开发工具。本次使用的是eclipse。

打开eclipse新建一个Dynamic Web Project

 

 

取名为Tezz,注意要勾上自动生成web.xml 选项

 

 

然后添加必须的文件

将下载的压缩包进行解压。完成后,进入文件夹可以看到如下目录结构。双击进入lib文件夹。

 

 

Lib文件夹有如下内容:注意到这里的mondrian.war文件是一个可直接布署的项目,我们需要将它解压,然后从中取出我们所需要的文件。(建议将其扩展名改成zip,然后直接右键解压)

 

 

进入解压后的文件夹,选中jpivot、wcf二个文件夹及busy.jsp、error.jsp、testpage.jsp三个文件,我们需要将这些资源复制到我们测试项目的WebRoot文件夹中。按ctrl+C键复制。

 

 

注:jpivot、wcf这两个文件夹包含mondrian使用的图像和css文件。Busy.jsp显示等待页面、error.jsp显示出错页面、testpage.jsp这文件的用处将在后面介绍。

切换到eclipse界面,在我们的Tezz项目的WebRoot文件夹处右击鼠标,在弹出的菜单中选择Paste(粘贴)即可

 

 

粘贴完成后的项目结构如下

 

 

注意:因为我们还未将所有资料复制到项目中,因此eclipse会显示错误图标

最后进入WEB-INF文件夹(在上面步骤中解压的项目文件mondrian.war里),选中jpivot、lib、wcf这三个文件夹,同样需要复制它们到测试项目的WEB-INF文件夹中。

 

 

Jpivot、wcf这两个文件夹包含jpivot和wcf用于生成用户界面的配置文件(*.xml、*.xsl)及标签文件(*.tld)的定义。Lib文件夹包含的是mondrian所要用的java包。

切换到eclipse界面,在我们的Tezz项目的WebRoot文件夹处右击鼠标,在弹出的菜单中选择Paste(粘贴)

 

 

至此Mondrian的支持添加完毕,下面我们将配置web.xml,让我们的项目能够使用到mondrian的功能。

接下来我们需要配置的是web.xml

过滤器(filter)

复制如下所示的xml代码到我们测试项目Tezz的web.xml文件中。

作用:这个过滤器在访问/testpage.jsp前被调用。它被设计成jpivot的前端控制器,用于判断并将用户的请求发送到某个页面。

注:在实际项目中可以使用您自己定义的servlet或使用其他技术来替代它以提供更多的功能


  1.    
  2.     JPivotController  
  3.     com.tonbeller.wcf.controller.RequestFilter  
  4.       
  5.       

    indexJSP  

  6.       

    /index.html  

  7.       如果这是一个新的会话,则转到此页面  
  8.       
  9.       
  10. 10.       

    errorJSP  

  11. 11.       

    /error.jsp  

  12. 12.       出错时显示的页面  
  13. 13.       
  14. 14.       
  15. 15.       

    busyJSP  

  16. 16.       

    /busy.jsp  

  17. 17.       这个页面用于当用户点击一个查询时,在这个查询还未将结果还回给用户时所显示的界面  
  18. 18.       

19.   


  1. 20.   
  2. 21.     
  3. 22.     JPivotController  
  4. 23.     /testpage.jsp  
  5. 24.     

Print  servlet,该servlet用于将数据生成Excel文件或pdf文件并返回给用户,如果您需要用到该功能,则需要将其copy到您项目的web.xml文件中


  1.   
  2.     Print  
  3.     Print  
  4.     Default configuration created for servlet.  
  5.     com.tonbeller.jpivot.print.PrintServlet  
  6.     
  7.    
  8.     Print  
  9.     /Print  
  10. 10.     

MDXQueryServlet用于接受并执行一个MDX查询,然后将该查询以Html表格的形式返回。其中的参数connectString用于指定连接到数据库的字符串,例如使用jtds驱动连接到sql server 2000的字符串如下:

Provider=mondrian;Jdbc=jdbc:jtds:sqlserver://localhost/Tezz;user=sa;password=123456;Catalog=/WEB-INF/queries/tezz.xml;JdbcDrivers=net.sourceforge.jtds.jdbc.Driver; 

如果您需要用到该功能,则需要将其copy到您项目的web.xml文件中。


  1.   
  2.     MDXQueryServlet  
  3.     mondrian.web.servlet.MDXQueryServlet  
  4.       
  5.       

    connectString  

  6.       

    @mondrian.webapp.connectString@  

  7.       
  8.     
  9.    
  10. 10.     MDXQueryServlet  
  11. 11.     /mdxquery  
  12. 12.     

DisplayChart 和GetChart 这两个Servlet 用于生成图表和将其显示给最终用户,如果您需要用到该功能,则需要将其copy到您项目的web.xml文件中。


  1.   
  2.     
  3.     DisplayChart  
  4.     org.jfree.chart.servlet.DisplayChart  
  5.     
  6.     
  7.     
  8.     GetChart  
  9.     GetChart  
  10. 10.     Default configuration created for servlet.  
  11. 11.     com.tonbeller.jpivot.chart.GetChart  
  12. 12.     

13.   


  1. 14.     DisplayChart  
  2. 15.     /DisplayChart  
  3. 16.     

17.   


  1. 18.     GetChart  
  2. 19.     /GetChart  
  3. 20.     

最后添加以下标签库到我们的web.xml项目中即可


  1.   
  2.    http://www.tonbeller.com/wcf  
  3.    /WEB-INF/wcf/wcf-tags.tld  
  4.    
  5.   
  6.    
  7.    http://www.tonbeller.com/jpivot  
  8.    /WEB-INF/jpivot/jpivot-tags.tld  
  9.    

至此,一个mondrian项目配置已经完成,下面就是写xml和jsp了

如果使用的是Myeclipse的话需新建一个Web Project,注意需要加入JSTL支持

 

 

 

 

剩余步骤和在Eclipse中一样

 


1.4 测试用例

 

下面贴出一个测试用例,以及中间遇见的问题供大家参考

 

建表语句

 

/**销售表*/  

create table Sale (  

    saleId int not null,  

    proId int null,  

    cusId int null,   

    unitPrice float null,    --单价  

    number int null,     --数量  

    constraint PK_SALE primary key (saleId)  

)  

    /**用户表*/  

create table Customer (  

    cusId int not null,  

    gender char(1) null,    --性别  

    constraint PK_CUSTOMER primary key (cusId)  

)  

/**产品表*/  

create table Product (  

    proId int not null,  

    proTypeId int null,  

   proName varchar(32) null,  

    constraint PK_PRODUCT primary key (proId)  

)  

/**产品类别表*/  

create table ProductType (  

    proTypeId int not null,  

    proTypeName varchar(32) null,  

    constraint PK_PRODUCTTYPE primary key (proTypeId)  

)  

 

插入数据

 

insert into Customer(cusId,gender) values(1,'F') 

insert into Customer(cusId,gender) values(2,'M') 

insert into Customer(cusId,gender) values(3,'M') 

insert into Customer(cusId,gender) values(4,'F') 

insert into producttype(proTypeId,proTypeName) values(1,'电器') 

insert into producttype(proTypeId,proTypeName) values(2,'数码') 

insert into producttype(proTypeId,proTypeName) values(3,'家具') 

insert into product(proId,proTypeId,proName) values(1,1,'洗衣机') 

insert into product(proId,proTypeId,proName) values(2,1,'电视机') 

insert into product(proId,proTypeId,proName) values(3,2,'mp3')  

insert into product(proId,proTypeId,proName) values(4,2,'mp4') 

insert into product(proId,proTypeId,proName) values(5,2,'数码相机') 

insert into product(proId,proTypeId,proName) values(6,3,'椅子') 

insert into product(proId,proTypeId,proName) values(7,3,'桌子') 

insert into sale(saleId,proId,cusId,unitPrice,number) values(1,1,1,340.34,2) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(2,1,2,140.34,1) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(3,2,3,240.34,3) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(4,3,4,540.34,4) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(5,4,1,80.34,5) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(6,5,2,90.34,26) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(7,6,3,140.34,7) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(8,7,4,640.34,28) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(9,6,1,140.34,29) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(10,7,2,740.34,29) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(11,5,3,30.34,28) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(12,4,4,1240.34,72) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(13,3,1,314.34,27) 

insert into sale(saleId,proId,cusId,unitPrice,number) values(14,3,2,45.34,27)

 


建立模式(schema)文件

简单的说,配置一个模式就是配置一个关系数据结构到多维数据结构的映射。就是创建一个xml文件来实现数据库表与多维数据源的对应关系,聚合,新增字段。

 

在WEB-INFO目录下新建一个queries的文件夹,然后新建一个名为tse的XML文件,文件内容如下;注意Schema name 与 Cube name

 

      

      

      

      

             

                    

                    

             

      

      

      

             

                    

                           

                           

                    

                    

                            nameColumn="PROTYPENAME" uniqueMembers="true" table="PRODUCTTYPE" />

                    

                            uniqueMembers="true" table="PRODUCT" />

             

      

      

      

             

             

                     (UNITPRICE*NUMBER1)

             

      

      

              [Measures].[totalsell] / [Measures].[quan1]

             

      

 

 

接着在该文件夹下建立一个同名的jsp文件,文件用来存储我们连接数据库的驱动,地址,用户名,密码和我们要使用的sql查询语句 示例如下:

 

<%@ page session="true" pageEncoding="UTF-8" cOntentType="text/html; charset=UTF-8" %>

<%@ taglib uri="http://www.tonbeller.com/jpivot" prefix="jp" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

 

   jdbcUser="hlsoa" jdbcPassword="hlsoa" cOnnectionPooling="false">

select

  {[Measures].[quan1], [Measures].[avgsell], [Measures].[totalsell]} on columns,

  {([good].[allgood], [sex].[allsex])} ON rows

from Sales

Test Query uses Mondrian OLAP

 

如果是直接在Tomcat部署的话,打开浏览器输入http://localhost:8080/mondrian/testpage.jsp?query=tse就可以出现结果

如果是通过IDE,打开浏览器输入http://localhost:8080/Tezz/testpage.jsp?query=tse

 

 


1.5常见的错误与问题


1.5.1数据库驱动和数据库连接问题

 

 

 

报这个错误说明我们缺少oracle驱动jar包加载不了oracle驱动,此时我们可以从Oracle官网下载或者在以前的项目中复制一个过来放到WEB-INF下的lib文件夹中

 

 

 

 

第二点要注意的是我们写在tse.jsp文件中的jdbcUrl,Driver一定不能写错,不要前后多出

空格。同时cataloguri也要写成相对应的,用户名、密码同样不能出错。

 

 


1.5.2 testpage.jsp attribute”test” with 报错问题

 

 

 

解决方法:找到webapps下的testpage.jsp页面到到query01这一段直接删除

 

 

 


1.5.3执行SQl语句报错情景1(Oracle数据库特有问题)

 

 

 

当时一切都改好了,就是在执行SQL语句是报错,将这段语句看了半天也没发现错误,在网上查找半天也没有解决方案,最后发现错误出现在cube文件中,因为本人使用的数据库是Oracle,所以cube文件里面所涉及到数据库字段的名称都要改成大写,这样mondrian才能够识别。这个问题耽误好长时间。。。。

 

 


1.5.4 常见的乱码和字符集设置问题

在jsp和xml文件中要与数据库的字符集保持一致,同时为了防止出现乱码问题,也可以借鉴作者的方法在jsp和xml文件中尽量避免出现中文。

 

 


推荐阅读
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
author-avatar
一林泽鹏_444
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有