终于做完mondrian的小项目,先将遇到了一些问题和经验记下来。
在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″?>
这个问题想必是每个新手的头疼的问题,官方的例子看不懂,英文文档看得吃力。建议先了解下数据仓库中的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
这个问题是由于维度中的表名或者列名拼写错误,特别是大小写。oracle是区分大小写的,切记。
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 为维度以及级别
日志提示 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下(推荐)
这是因为其他查询也自动加载聚合表了,要在
下使用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我没试过。
如果你跟我一样拿到的是一个oracle导出的dmp文件,又准备在mysql中用。那只能先装oracle,将dmp导入到oracle,然后使用这个神器——DBImport_V30将oracle中的数据导入到mysql中。(勾选使用分页就可以无限制数据量,不过会有时间限制,重启电脑即可)