`

Mondrian中MDX查询使用时收集的bug及异常处理小结

阅读更多

     由于要做多维报表的展现,需要使用OLAP的引擎Mondrian,于是最近一直在学习MDX查询语言,在做Demo时遇到了很多bug,我认为这些异常对于初学MDX查询语言的朋友来说很常见,一般都会遇到这些bug,这里我将自己遇到的bug收集起来,同时将其解决方法一并记录下来,希望遇到同样问题的朋友可以参考一下,希望可以节省一些你调试此类bug的时间。

 

 

异常: 1

  [JPivot] 15 七月 2010 10:10:36,312 ERROR [Session FC17340B57820BEB01CC6F6D86DAE1E6] com.tonbeller.jpivot.tags.OlapModelTag#doEndTag:

com.tonbeller.jpivot.olap.model.OlapException : Mondrian Error:All arguments to function '{}' must have same hierarchy.

 

解决方案:

问题是集合( Set )中的成员不在同一个层次里,比如写成

select {[Measures].[ 总销售额 ],[Measures].[ 贡献度 ]} ON columns,

  {[ 产品类别 ].[ 所有产品 ],[ 客户性别 ].[ 所有性别 ]} ON rows

from [Sales]

 

        由于“产品类别”和“客户性别”是两个不同的维度 ,而 MDX 的基本特性 3 —集合( Set ),它的特点是集合里可以含有若干个 Member ,但是必须是同一维度上的 Member, {[Time].[1996],[Time].[1997]}

也可以是 Cube 上的若干个 Tuple 的集合,同样要注意的是,这些 Tuple 集合的子集之间存在严格的维度对称关系,如 {([Computers].[China]),([Air_Conditioner].[Jpan])}.

 

 

小知识点说明:

 

[销售季度].[所有季度] [销售季度].children的区别:

如下面的例子:

 

 

 

select {[ 销售季度 ].[ 所有季度 ]} ON columns,

 

  {[ 产品类别 ].CHILDREN} ON rows

     from [Sales]

 

select {[ 销售季度 ]. CHILDREN } ON columns,

  {[ 产品类别 ].CHILDREN} ON rows

     from [Sales]

 

的区别是:

 

首先,前者是一个 Member ,后者是一个集合( Set ),因此在使用时,特别是放在一个 Set 中使用时要特别注意,否则会报我上面所说的异常 1

其次,两者显示出来的效果图也是不一样的,在页面上,前者点击“所有季度”后才会展现所有季度;而后者是直接将“第一季度,第二季度,第三季度,第四季度”依次显示在页面客户面前,不能按层次收缩。

 

 

 

 

 

 

异常: 2

mondrian.olap.MondrianException : Mondrian Error:Named set in cube 'Sales' has bad formula

Caused by: mondrian.olap.MondrianException : Mondrian Error:Error while parsing MDX statement 'WITH

MEMBER [Measures].[ 平均单价 ]

  AS '[Measures].[ 总销售额 ] / [Measures].[ 数量 ]',

FORMAT_STRING = " #,##0.00",

[$member_scope] = 'CUBE',

MEMBER_ORDINAL = 2

MEMBER [Measures].[ 贡献度 ]

  AS '([Measures].[ 总销售额 ],[ 所有类别 ].CURRENTMEMBER) / ([Measures].[ 总销售额 ],[ 所有类别 ].[ 所有产品 ])',

FORMAT_STRING = "#%",

[$member_scope] = 'CUBE',

MEMBER_ORDINAL = 3

SELECT FROM [Sales]'

    at mondrian.resource.MondrianResource$_Def0.ex( MondrianResource.java:785 )

    at mondrian.olap.Parser.parseInternal( Parser.java:759 )

    at mondrian.olap.ConnectionBase.parseQuery( ConnectionBase.java:74 )

    ... 59 more

Caused by: mondrian.olap.MondrianException : Mondrian Error:MDX object '[ 所有类别 ]' not found in cube 'Sales'

 

 

解决方法:

这个问题报错是由于解析 MDX 查询语句时发现问题解析不了。

一般遇到这个错就是 MDX 查询语句中的维度和 schema 文件 tezz.xml 里定义的拼写的不一致,或者就是单词拼写错误,我的错误是就是在 schema 文件里定义 calculator 时名称写的不一致。

 

 

 

异常: 3

Caused by: mondrian.olap.MondrianException : Mondrian Error:Error while parsing MDX statement '

 

select {[Measures].[ 数量 ]} ON columns,

          {([ 产品类别 ].[ 所有产品 ]),([ 销售季度 ].[ 第一季度 ])} ON rows

       from [Sales]

'

    at mondrian.resource.MondrianResource$_Def0.ex( MondrianResource.java:785 )

    at mondrian.olap.Parser.parseInternal( Parser.java:759 )

    at mondrian.olap.ConnectionBase.parseQuery( ConnectionBase.java:74 )

    ... 47 more

Caused by: mondrian.olap.MondrianException : Mondrian Error:Internal error: while building member cache; sql=[select "Quarter"."quarterId" as "c0", "Quarter"."quarterName" as "c1" from "Month" as "Month", "Quarter" as "Quarter" where "Month"."quarterId" = "Quarter"."quarterId" and UPPER("Quarter"."quarterName") = UPPER(' 第一季度 ') group by "Quarter"."quarterId", "Quarter"."quarterName" order by "Quarter"."quarterId" ASC]

 

 

解决方法:

     从异常信息可以看出解析 MDX 语句时发生错误,这个错是由于我表与表之间的关系在 schema 文件 tezz.xml 中定义的不对,以至于解析出的 sql 里出现了字段错位到别的表里去了。将各表间关系定义正确了就可以了。

 

 

 

 

异常: 4

[JPivot] 19 七月 2010 15:19:29,656 ERROR [Session ] com.tonbeller.jpivot.tags.OlapModelTag#doEndTag:

com.tonbeller.wcf.controller.EmptyThreadLocalStackException

org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: com.tonbeller.wcf.controller.EmptyThreadLocalStackException

    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)

    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)

    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)

    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)

    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

 

 

页面报的异常为:

org.apache.jasper.JasperException: An exception occurred processing JSP page/test/param1.jsp at line 23:

 20:

 21:Click on a Region.

 22:<p>

 23:<wcf:include id="include01" httpParam="query" prefix="/WEB-INF/queries/" suffix=".jsp"/>

 24:  

  25:<from action="param1.jsp" method="post" id="form01">

  26:

 

 


解决方案:

     这个异常耽误了我和同事半天的时间,从控制台和页面信息都找不出错误原因,上网查资料,是有这个异常,我是中英文的网页资料说明都看了,就是没看到解决方法。最后,还是同事的另外一个异常给了我提示,于是我去 web.xml 文件中查看,果然是里面配置出现了问题。

     将 web.xml 中的 filter url­-pattern 值由 testpage.jsp 改为 *.jsp 即可!

 

我之前的 web.xml filter 的配置如下:

< filter >

    < filter-name > JPivotController </ filter-name >

    < filter-class > com.tonbeller.wcf.controller.RequestFilter </ filter-class ></ filter >

  < filter-mapping >

    < filter-name > JPivotController </ filter-name >

    < url-pattern > testpage.jsp </ url-pattern >

  </ filter-mapping >

 

 

 

 

异常: 5

[JPivot] 20 七月 2010 13:59:00,218 ERROR [Session E2F53D86EE225E320A412091BF8E28D9] com.tonbeller.wcf.controller.RequestFilter#doFilter: Error handling request

com.tonbeller.jpivot.olap.model.OlapException : Mondrian Error:No function matches signature ' Parameter(<String>, <Dimension>) '

    at com.tonbeller.jpivot.mondrian.MondrianModel.initialize( MondrianModel.java:550 )

 

解决方案: Parameter 方法有错,其参数好像不能为2个,我改成了3个异常就解决了,bug虽解决了了,但对Parameter的使用及里面的各个参数的作用和意义都不清楚,网上也没找到资料,要是哪位朋友知道的话请不惜赐教一下:

 

将下面代码中的查询:

< jp:mondrianQuery id = "paramquery01" catalogUri = "/WEB-INF/queries/tezz.xml"

    jdbcDriver = "net.sourceforge.jtds.jdbc.Driver"

    jdbcUrl = "jdbc:jtds:sqlserver://localhost:1433/Tezz" jdbcUser = "sa"

jdbcPassword = "123" >

select

  {[Measures].[ 数量 ],[Measures].[ 平均单价 ],[Measures].[ 总销售额 ]} ON columns,

  {Parameter("ProductMember", [ 产品类别 ])} ON rows

from [Sales]

</ jp:mondrianQuery >

 

改为:

select

  {[Measures].[ 数量 ],[Measures].[ 平均单价 ],[Measures].[ 总销售额 ]} ON columns,

  {Parameter("ProductMember", [ 产品类别 ],[ 产品类别 ].[ 数码 ])} ON rows

from [Sales]

 

 

 

 

 

异常: 6

 

[JPivot] 20 七月 2010 14:05:45,781 ERROR [Session D24F8131994DE11BA5856AC44236BD90] com.tonbeller.wcf.controller.RequestFilter#doFilter: Error handling request

com.tonbeller.jpivot.olap.navi.ExpressionParser$InvalidSyntaxException : [????].[????].[??].[???]

    at com.tonbeller.jpivot.mondrian.MondrianExpressionParser.parse( MondrianExpressionParser.java:121 )

    at com.tonbeller.jpivot.param.SetParameterTag.setQueryParam( SetParameterTag.java:93 )

 

解决方案:异常原因是中文乱码,建议 1: 改成英文的,建议 2: 加个过滤器,我暂时使用的是方法 1 ,方法 2 加过滤器没成功,在 web.xml 中加上如下代码:

<filter>

    <filter-name>Set Character Encoding</filter-name>

    <filter-class>com.tonbeller.wcf.charset.CharsetFilter</filter-class>

    <init-param>

        <param-name>encoding</param-name>

        <param-value>UTF-8</param-value>

    </init-param>

  </filter>

 

  <filter-mapping>

    <filter-name>Set Character Encoding</filter-name>

    <url-pattern>/*</url-pattern> 

  </filter-mapping>

 

      也许还要进行其他设置,目前我还没找到解决的方法。

如果哪位朋友知道解决的方法希望告知!同时,由于mdx刚学不久,对于上面总结的不对的地方希望可以指出来!

 

 


By the way, 供大家交流Pentaho的圈子,里面可以共享有关pentahoBI平台学习的资料,期待您的加入! http://pentahofrends.group.iteye.com/

 

 

0
0
分享到:
评论
2 楼 jcyanfan 2013-06-18  
补充一个:

Caused by: mondrian.olap.MondrianException: Mondrian Error:No function matches signature '{<Level>}'

这个异常的原因一般是level的名称,和Dimension的名称一致导致的
1 楼 鱼丸粗面 2012-06-07  
楼主有心人,好多异常也遇到了,第4个异常实在做页面展示的时候遇到的,比如做了个使图片在新的jsp页面中展示,这个jsp也要和testpage一样配置。不过用用通配符配置有时会出问题,有针对性的配置可能更好,一点拙见。

相关推荐

    mondrian ROLAP MDX 经典资料

    mondrian ROLAP MDX 经典资料打包。 MDX的基本语法及概念.ppt ROLAP的概念.ppt 如何将Mondrian用于web项目.ppt MDX的基本语法及概念.ppt doc_cn jpivot

    Mondrian的异常处理小结

    需要使用OLAP的引擎Mondrian,于是最近一直在学习MDX查询语言,在做Demo时遇到了很多bug,我认为这些异常对于初学MDX查询语言的朋友来说很常见,一般都会遇到这些bug,这里我将自己遇到的bug收集起来,同时将其解决...

    Mondrian解析MDX成sql语句的分析与整理

    NULL 博文链接:https://ruinxdgzy.iteye.com/blog/720723

    Mondrian+Oracle 实例

    Mondrian+Oracle 实例,及异常分析,功能介绍,连接数据库的各种方式等

    Pentaho多维分析(Mondrian)使用指南

    本文档介绍 OLAP、MDX 基本概念和原理、Mondrian 的使用和一些前端工具的使用。其中 “基本概念”和“MDX”这两章基本都是通用的内容,并不仅限于 Mondrian。 本文档主要用做简略的指南,更深入、更详细的内容请参考...

    Mondrian实例

    这个Java实例将利用Mondrian提供的OLAP引擎对已建立好的数据立方体XML进行MDX查询。不是网上到处都有的jPivot,而是一个更基础更轻量的例子。

    数据分析工具mondrian教程

    本教程包含mondrian部分中文文档 mondrian如何创建Cube,维度,度量及其他属性 mdx语法介绍

    MDX详解文档

    mdx详解。 mondrian.. mdx

    Mondrian介绍及配置.pdf

    Mondrian 介绍 配置

    [Mondrian] Mondrian 实战 英文版

    [Manning Publications] Mondrian 实战 英文版 [Manning Publications] Mondrian in Action E Book ☆ 出版信息:☆ [作者信息] William Back D Nicholas Goodman Julian Hyde [出版机构] Manning ...

    mondrian3.5

    Mondrian是一个开放源代码的Rolap服务器,使用java开发的。它实现了xmla和jolap规范,而且自定义了一种使用mdx语言的客户端接口。Mondrian是olap服务器,而不是数据仓库服务器,因此Mondrian的元数据主要包括olap...

    mondrian 如何使用xml存储olap服务器的元数据.doc

    Mondrian是一个开放源代码的Rolap服务器,使用java开发的。它实现了xmla和jolap规范,... Mondrian中使用物理的xml文件存储元数据,它的设计者规定了xml文件的格式。下面简单介绍一下它是如何存储元数据的。

    基于ORACLE的mondrian配置

    自已刚开始学mondrian,里面有两个文件,一个是mondrian自带的一个演示示例,是基于oracle实现的过程。还有一个是eclipse中配置mondrian源代码的过程。都是我自己总结的,原创。QQ:6855957

    mondrian foodmart SQL SERVER 数据库

    mondrian foodmart SQL SERVER 数据库

    mondrian-3.5.0

    mondrian-3.5.0.jar 解决中文乱码问题

    Mondrian中聚合表的应用

    最近在项目中使用了开源OLAP引擎——Mondrian实现一个多维分析系统,在项目后期系统优化阶段使用了Mondrian中的聚合表机制。这里结合 Mondrian官方资料和个人使用经验,对Mondrian中聚合表的概念、应用场景、如何...

    Manning.Mondrian_in_Action.2013.pdf

    reports 22 ■ Interactive analytics 24 ■ MDX analysis with Saiku 25 www.it-ebooks.info viii CONTENTS 2.3 Multidimensional modeling 27 A simple report 27 ■ Modeling business questions 28 2.4 Getting ...

    mondrian报表技术概要

    mondrian报表技术概要,实例讲述开发过程中遇到的问题以及配置

    mondrian-olap:JRuby gem,用于使用Mondrian OLAP Java库执行关系数据库数据的多维查询

    SQL语言非常适合从关系数据库中进行临时查询,但是当执行更复杂的分析查询以获取摘要结果时,SQL语言变得非常复杂。 替代方法是OLAP(在线分析处理)数据库和引擎,它们提供了不同摘要级别的更轻松的多维数据分析。 ...

    Mondrian使用图论的php代码静态分析工具

    Mondrian - 使用图论的php代码静态分析工具

Global site tag (gtag.js) - Google Analytics