转~mondrian的一些经验总结

终于做完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中。(勾选使用分页就可以无限制数据量,不过会有时间限制,重启电脑即可)


转载于:https://my.oschina.net/tuatua/blog/300597

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值