终于做完mondrian的小项目,先将遇到了一些问题和经验记下来。

1. 支持中文

在web.xml中添加过滤如下:

<servlet> 
<servlet-name>MondrianXmlaServlet</servlet-name> 
<servlet-class>mondrian.xmla.impl.DynamicDatasourceXmlaServlet</servlet-class> 
<init-param> 
<param-name>CharacterEncoding</param-name> 
<param-value>UTF-8</param-value> 
</init-param>       
</servlet>

然后在把各个文件上面的编码方式改成utf-8
如 xml version=“1.0” encoding=“UTF-8”

2. Scema怎么写

这个问题想必是每个新手的头疼的问题,官方的例子看不懂,英文文档看得吃力。 建议先了解下数据仓库中的scema,在看下官方文档,模仿官方例子写个最简单的scema。这里给出个简单的scame供参考

<?xml version="1.0" encoding="UTF-8"?>
<Schema name="FoodMart">
<Cube name="shebao" defaultMeasure="就诊人数">
<Table name="WJ_MZSFB0_201005"></Table>
<Dimension name="网点级别" foreignKey="WDJBBH">
<Hierarchy hasAll="true" allMemberName="所有级别" primaryKey="WDJBBH">
<Table name="BM_WDJBB0"/>
<Level name="jibie" column="WDJBMC" uniqueMembers="false"/>
</Hierarchy>
</Dimension>
<Dimension name="IC卡状态" foreignKey="ICZTBH">
<Hierarchy hasAll="true" allMemberName="所有状态" primaryKey="ICZTBH">
<Table name="BM_ICKZT0"/>
<Level name="status" column="ICZTMC" uniqueMembers="false"/>
</Hierarchy>
</Dimension>

<Dimension name="时间" foreignKey="TIME_ID">
<Hierarchy hasAll="true" allMemberName="所有时间" primaryKey="TIME_ID">
<Table name="BM_TIME00"/>
<Level name="week" column="WEEK" uniqueMembers="true"/>
<Level name="day" column="DAY" uniqueMembers="false"/>
<Level name="hour" column="HOUR" uniqueMembers="false"/>
</Hierarchy>
</Dimension>

<Measure name="就诊人数" column="LRLSH0" aggregator="distinct-count" datatype="Integer"/>
<Measure name="就诊次数" column="DJLSH0" aggregator="count" datatype="Integer"/>
<Measure name="保费合计" column="BCBXF0" aggregator="sum" datatype="Numeric"/>
</Cube>
</Schema>

这里对应的mdx语句为

select
{[Measures].[就诊人数], [Measures].[就诊次数], [Measures].[保费合计]} on columns,
{([时间].[所有时间],[网点级别].[所有级别], [IC卡状态].[所有状态])} ON rows
from shebao

3. query01.result.overflowOccured

这个问题是由于维度中的表名或者列名拼写错误,特别是大小写。oracle是区分大小写的,切记。

4. oracle中的表名列名如果有小写,就要用双引号才能识别,否则会出现未定义的表名和列名的错误

5. 创建聚合表

CREATE TABLE AGG_C_1_WJ_MZSFB0(WEEK VARCHAR(20),GZZT00 CHAR(6),XFLXBH CHAR(6),PEOPLE_SUM INTEGER,TIMES_SUM INTEGER,MONEY_SUM INTEGER,FACT_COUNT INTEGER);

INSERT INTO AGG_C_1_WJ_MZSFB0_201005(
WEEK,
GZZT00,
XFLXBH,
PEOPLE_SUM,
TIMES_SUM,
MONEY_SUM,
FACT_COUNT)
SELECT
BM_TIME00.WEEK,
WJ_MZSFB0_201005.GZZT00,
WJ_MZSFB0_201005.XFLXBH,
COUNT(DISTINCT WJ_MZSFB0_201005.LRLSH0) AS PEOPLE_SUM,
COUNT(WJ_MZSFB0_201005.DJLSH0) AS TIMES_SUM,
SUM(WJ_MZSFB0_201005.BCBXF0) AS MENEY_SUM,
COUNT(*) AS FACT_COUNT
FROM 
WJ_MZSFB0_201005,BM_TIME00
WHERE
WJ_MZSFB0_201005.TIME_ID=BM_TIME00.TIME_ID
GROUP BY 
BM_TIME00.WEEK,
WJ_MZSFB0_201005.GZZT00,
WJ_MZSFB0_201005.XFLXBH;

Scema中的定义如下

<Table name="WJ_MZSFB0_201005">
<AggName name="AGG_C_0_WJ_MZSFB0_201005">
<AggFactCount column="FACT_COUNT"/>
<AggForeignKey factColumn="GZZT00" aggColumn="GZZT00" />
<AggForeignKey factColumn="XFLXBH" aggColumn="XFLXBH" />
 <AggForeignKey factColumn="ICZTBH" aggColumn="ICZTBH" />
  <AggForeignKey factColumn="DWLB00" aggColumn="DWLB00" />
 <AggForeignKey factColumn="WDJBBH" aggColumn="WDJBBH" />

<AggMeasure name="[Measures].[就诊人数]" column="PEOPLE_SUM" />
<AggMeasure name="[Measures].[就诊次数]" column="TIMES_SUM" />
<AggMeasure name="[Measures].[保费合计]" column="MONEY_SUM" />
<AggLevel name="[时间].[week]" column="WEEK" />
<AggLevel name="[消费类型].[type]" column="XFLXBG" />
<AggLevel name="[工作状态].[status]" column="GZZT00" />
</AggName>

AggForeignKey用来指定事实表和聚合表对应的列名
AggMeasure中name为度量,column为聚合表中相应的列
AggLevel 为维度以及级别

6. 聚合表写好却不识别

日志提示 WARN [mondrian.olap.MondrianProperties] mondrian.properties can’t be found under ’d:\Program Files\Apache Software Foundation\Tomcat 7.0.’ or classloader (输出日志方法请看上一篇文章) 这是由于 mondrian.properties为识别,而 mondrian.properties中定义了使用聚合表:

mondrian.rolap.aggregates.Use=true
mondrian.rolap.aggregates.Read=true

所以只要把 mondrian.properties复制要Tomcat目录下或者Web-INF\classes下(推荐)

7. 聚合表建好后,其他不用具备表的查询不能用了,提示Mondrian Error:Too many errors, ‘6’, while loading/reloading aggregates.

这是因为其他查询也自动加载聚合表了,要在下使用AggExclude排除聚合表,如下所示:

 <Table name="WJ_MZSFB0_201005">
  <AggExclude name="AGG_C_0_WJ_MZSFB0_201005" />
  <AggExclude name="AGG_C_1_WJ_MZSFB0_201005" />
  <AggExclude name="AGG_C_2_WJ_MZSFB0_201005" />
  <AggExclude name="AGG_C_3_WJ_MZSFB0_201005" />
  <AggExclude name="AGG_C_4_WJ_MZSFB0_201005" />
  <AggExclude name="AGG_C_5_WJ_MZSFB0_201005" />
 </Table>

这里要指出的是聚合表的Schema和非聚合表的Schema最好是分开的,也就是不同的xml里面。至于在同一xml里使用不同cube我没试过。

8. oracle数据导入

如果你跟我一样拿到的是一个oracle导出的dmp文件,又准备在mysql中用。那只能先装oracle,将dmp导入到oracle,然后使用这个神器——DBImport_V30将oracle中的数据导入到mysql中。(勾选使用分页就可以无限制数据量,不过会有时间限制,重启电脑即可)