Mondrian异常
由于要做多維報表的展現,需要使用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>
?
??????也許還要進行其他設置,目前我還沒找到解決的方法。
異常:8
?
[JPivot] 21 七月 2010 23:26:31,109 ERROR [Session 3DA5B31A164F01E50C42D796D221BC2F] com.tonbeller.jpivot.tags.OlapModelTag#doEndTag:
mondrian.olap.MondrianException:?Mondrian Error:Named set in cube?'Sales' has bad formula
.
Caused by: mondrian.olap.MondrianException: Mondrian Error:No function matches signature '<Level>.prevMember'
?
?
解決方法:這個異常可以參看異常15。
?
?
%***************************************************************************
?
異常:9
?
?
33031 [http-8088-2]?ERROR com.tonbeller.wcf.controller.RequestFilter? -?Error handling request
javax.servlet.ServletException: javax.servlet.jsp.JspException: com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:Syntax error at line 1, column 59, token 'EOF'
Caused by: mondrian.olap.MondrianException: Mondrian Error:Syntax error in MDX expression 'IsAncestor([Sale Region].CurrentMember,[Sale Region].[suzhou]'
??? at mondrian.resource.MondrianResource$_Def0.ex(MondrianResource.java:785)
?
解決方法:待解決
?
?
%***************************************************************************
?
?
?
?
異常:10
Caused by: com.tonbeller.jpivot.olap.model.OlapException:?Mondrian Error:Tuple contains more than one member of dimension?'[Product Category]'.
??? at com.tonbeller.jpivot.mondrian.MondrianModel.initialize(MondrianModel.java:550)
?
解決方法:
由于我粗心,將“.”誤寫成了“,”,才會報上面異常。修改方法為將“[Product Category],[All Products]”改為“[Product Category].[All Products]”。
select {[Measures].[ROI],[Measures].[Number],Measures.[Number Proportion],[Measures].[Average UnitPrice],[Measures].[Total Sale],[Measures].[Product Percentage]} ON columns, NON EMPTY
? {([Product Category],[All Products],[Customer Sex].[All Sex])} ON rows from [Sales]
?
?
%***************************************************************************
異常:11
?
2474343 [http-8080-2] ERROR com.tonbeller.jpivot.tags.OlapModelTag? -
mondrian.olap.MondrianException: Mondrian Error:Internal error: Error while creating SQL dialect
??? at mondrian.resource.MondrianResource$_Def0.ex(MondrianResource.java:785)
??? at mondrian.olap.Util.newInternal(Util.java:1340)
??? at java.lang.Thread.run(Thread.java:619)
Caused by: java.sql.SQLException: Network error IOException: Connection refused: connect
?
?
解決方法:
由異常信息可看出出現此異常是由于連接數據庫出錯,我仔細檢查了是由于將mysql數據庫連接成了SqlServer數據庫。
?
?
%***************************************************************************
?
異常:12
?
154157 [http-8080-1]?ERROR com.tonbeller.wcf.controller.RequestFilter? - exeption
org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: OlapModel/Query ${paramquery01} not found
??? at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
?
?
解決方法:
錯誤原因是以下代碼中:
<jp:setParam query="${paramquery01}" httpParam=?"param"?mdxParam=?"ProductMember">
<jp:mondrianQuery id="query01"
??? jdbcDriver="com.mysql.jdbc.Driver"
??? jdbcUrl="jdbc:mysql://localhost:3306/tezz?user=root&password=sys"
??? catalogUri="/WEB-INF/queries/tezz.xml" >
select
?{[Measures].[Number],[Measures].[Average UnitPrice],[Measures].[Total Sale]} ON columns,
?{Parameter("ProductMember", [Product Category],[Product Category].[All Products])} ON rows
from [Sales]
</jp:mondrianQuery>
</jp:setParam>
?
jpivot的setParam標簽的query屬性值就是mondrianQuery標簽的id屬性值,應一致。將query01改為paramquery01即可。
?
%***************************************************************************
異常:13
?
信息:?SessionListener: contextInitialized()
2010-7-23 8:44:12 org.apache.catalina.session.StandardManager doLoad
嚴重: IOException while loading persisted sessions: java.io.EOFException
java.io.EOFException
??? at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281)
??? at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
??? at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
??? at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
??? at org.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58)
?
?
?
解決辦法:重建項目換個項目名稱。
?
%***************************************************************************
異常:14
?
87875 [http-8088-1]?ERROR com.tonbeller.wcf.controller.RequestFilter? - exeption
?
頁面異常
org.apache.jasper.JasperException: An exception occurred processing JSP page /testpage.jsp at line 44
?
41: <form action="testpage.jsp" method="post">
42:
43: <%-- include query and title, so this jsp may be used with different queries --%>
44: <wcf:include id="include01" httpParam="query" prefix="/WEB-INF/queries/" suffix=".jsp"/>
45: <c:if test="${query01 == null}">
46:?? <jsp:forward page="/index.jsp"/>
47: </c:if>
?
?
Caused by: com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:No function matches signature '(<Set>, <Member>)'
??? at com.tonbeller.jpivot.mondrian.MondrianModel.initialize(MondrianModel.java:550)
??? at com.tonbeller.jpivot.olap.model.OlapModelDecorator.initialize(OlapModelDecorator.java:132)
?
解決方法:
我的mdx查詢語句如下:
?
select {[Measures].[Total Sale],[Measures].[Product Percentage]} ON columns,
? {([Product Category].[All Products].children,[Customer Sex].[All Sex])} ON rows
from [Sales]
?
改為:select {[Measures].[Total Sale],[Measures].[Product Percentage]} ON columns,
? {([Product Category].[All Products],[Customer Sex].[All Sex])} ON rows
from [Sales]
?
即可。
?
?
%***************************************************************************
異常:15
?
1317609 [http-8088-1]?ERROR com.tonbeller.wcf.controller.RequestFilter? - cause
javax.servlet.ServletException: javax.servlet.jsp.JspException: org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:No function matches signature '{<Level>}'
??? at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858)
?
Caused by: com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:No function matches signature '{<Level>}'
??? at com.tonbeller.jpivot.mondrian.MondrianModel.initialize(MondrianModel.java:550)
??? at com.tonbeller.jpivot.olap.model.OlapModelDecorator.initialize(OlapModelDecorator.java:132)
?
解決方案:
我的mdx查詢語句:
select {[Sale Time].[quarterName] } ON columns,
? {[Product Category].[All Products].CHILDREN} ON rows
???? from [Sales]
由于[Sale Time].[quarterName]只是到了級別(level),而集合set中只能是member或者tuple,
故只需將{[Sale Time].[quarterName]}改為{[Sale Time].[quarterName].AllMembers}
效果圖為:
?
?
?
{[Sale Time].[quarterName].AllMembers}與{[quarterName].AllMembers}得出的效果一樣。
?
若改為:{[Sale Time] },則效果圖為:
?
?
?
若改為:{[Sale Time].[quarterName].children},則報異常:
Caused by: javax.servlet.ServletException: javax.servlet.jsp.JspException: com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:No function matches signature '<Level>.children'
??? at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858)
同樣,{[Sale Time].[quarterName].children}與{[quarterName].children}效果是一樣的。
?
?
?
?
故我得出的結論是:
?
1. level下面不能調用children,只能用allmembers來獲得子集所有成員。Children可以用在層次hierarchy下面如:[Product Category].[All Products].children(注意的是這里的”All Products”是層次的allMemberName屬性,而非name屬性,用name屬性的寫法是[Sale Time.OnlyQ].children,此時也可以用allmembers);也可以直接在維度下面,如[Sale Time].children,顯示效果圖為:
?
同時,allmembers也可以用在直接維度下面如[Sale Time]. allmembers,顯示效果圖為將成員全部列出,不是下鉆(drill-down)形式,操作只能是上卷(drill-up):
?
結論2:兩個嵌套的level的(name屬性)不能同時用,即[yearName].[quarterName]會報找不到的錯誤,但涉及到具體的members就可以用,如[2007].[Q1].
?
涉及到具體member值如[2007],或[2007].[Q1]等的member,后面就不能使用member,allmembers,currentmember,都會報上面的同樣的錯,但可以使用如下術語:
Children,firstchild,parent,prevmember, nextmember。
總結
以上是生活随笔為你收集整理的Mondrian异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查找算法-志宇
- 下一篇: InfiniBand网络简介