mondrian教程

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

1. 支持中文

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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”?>






















1
2
这里对应的mdx语句为

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
## 3. query01.result.overflowOccured
这个问题是由于维度中的表名或者列名拼写错误,特别是大小写。oracle是区分大小写的,切记。
## 4. oracle中的表名列名如果有小写,就要用双引号才能识别,否则会出现未定义的表名和列名的错误
## 5. 创建聚合表
```sql
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中的定义如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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

1
2
3
4
5
所以只要把 mondrian.properties复制要Tomcat目录下或者Web-INF\classes下(推荐)
## 7. 聚合表建好后,其他不用具备表的查询不能用了,提示Mondrian Error:Too many errors, '6', while loading/reloading aggregates.
这是因为其他查询也自动加载聚合表了,要在下使用AggExclude排除聚合表,如下所示:









```

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

8. oracle数据导入

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

请我喝咖啡
liaol WeChat Pay

微信打赏