【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
MondrianSchema编写心得
1. Mondrian是什么?
Mondrian是一个用Java成的OLAP引擎。它实现了MDX语言、XML解析、JOLAP规范。它从SQL和其它数据源读取数据并把数据聚集在内存缓存中,然后经过 Java API用多维的方式对结果进行展示。
2. Mondrian组成与架构
Mondrian又四个manager组成,见下图:
l Session Manager:最为重要的一个部分。接受MDX查询、解析MDX,返回结果。
l Schema Manager:与初始化紧密相关。主要是一些重要的数据结构如缓存池的构建以及多维模型的生成。
l Aggregate Manager:实现了对聚集表的管理。主要是对OLAP缓存的管理,属于性能优化的部分。
l Dimension Manager:维度的管理。实现多维模型中维度和关系数据库表中列的映射,在Schema Manager也有部分功能处理这些映射。
从架构上可以分为四个层次:
l 计算层:分析,验证,执行MDX语句。先计算坐标轴,然后再计算每个单元格的值,从效率上的考虑,计算曾批量的从聚合层获取单元格数据集合。
l 聚合层:聚合层中缓存了多维查询结果,即单元格的数据集合,如果计算层所需要的数据不在缓存中,从存储层中进行查询获取数据并缓存。
l 存储层:一般使用关系数据库实现,一般采用星型结构,提供事实表,维度表和聚合表。
l 表现层:一般使用Saiku或者PentahoBI-server。
系统部署结构上,可以分三层结构分开部署,将表现层部署在一台机器上,计算层和聚合层部署在第二台,存储层部署在第三台。
3. MondrianSchema版本
需要注意的是MondrianSchema3.0和4.0的版本区别,升级过后SchemaXML的写法发生了比较大的变化。支持Schema3.0的写法,且shema4.0必须加上metamodelVersion='4.0'属性。
l Schema3.0支持的主要elements
立方体:<Cube>
维度:<Dimension>
层级:<Hierarchy>
级别:<Level>
度量:<Measure>
维表关联:<Join>
视图:<View>
虚拟立方体:<VirsualCube>
聚合表:<AggregateTbale>
计算成员:<CalculateMember>
l Schema4.0支持的主要elements
立方体:<Cube>
物理模型:<PhysicalSchema>
关联:<Link>:定义数据库物理表之间的关联关系
层级组:<Hierarchies>
层级:<Hierarchy>
级别:<Level>
维度组:<Dimensions>
维度:<Dimension>
维度属性:<Attribute>
度量组:<MeasureGroups>
度量维度关联:(事实表和维度表的关联)<DimensionLinks>
查询:<Query>:等同View
计算成员:<CalculateMember>
聚合表:<AggregateTable>
Schema3.0 |
Schema4.0 |
立方体:<Cube> |
立方体:<Cube> |
维度:<Dimension> 维表关联:<Join>雪花模型 |
维度组:<Dimensions> 维度:<Dimension> 维度属性:<Attribute> |
层级:<Hierarchy> 级别:<Level> |
层级组:<Hierarchies> 层级:<Hierarchy> 级别:<Level> |
度量:<Measure> |
度量组:<MeasureGroups> 度量维度关联:(事实表和维度表的关联)<DimensionLinks> |
视图:<View> |
查询:<Query>:等同View |
计算成员:<CalculateMember> |
计算成员:<CalculateMember> |
虚拟立方体:<VirsualCube> |
|
聚合表:<AggregateTable> |
聚合表:<AggregateTable> |
|
物理模型:<PhysicalSchema> 关联:<Link>:定义数据库物理表之间的关联关系 |
4. 多维数据分析平台构建
调研了两种个架构:
1. mysql(Kylin)+Mondrian+Mondrian workbench+Saiku
2. mysql+Mondrian+Pentaho Business intelligence server Community Edition
此例子使用第一种框架作为测试平台。平台框架如下:
MondrianSchema没有一个比较好的图形化编程工具,workbench只是一个这种的工具,且目前只找到3.0版本的。所以一般为手写。
Mysql和mondrian的安装就不做过多的介绍,mysql本地安装,mondrian下载最先的4.0版本的jar包即可。重点介绍一下Saiku的安装。
Saiku下载地址:http://community.meteorite.bi/,下载在最新的saiku-latest.zip解压。自带mysql驱动所以不需要导入mysql驱动包,只需要将下载的mondrian-4.0的jar包复制到server/tomcat/webapps/saiku/WEB-INF/lib/下面集成Mysql+mondrian+Saiku的三层数据分析系统。
启动Saiku,访问http://localhost:8080,注意安装在本机所以是localhost。默认用户名和密码是admin/admin。初次登录提示需要从http://licensing.meteorite.bi/网站获取一个免费的证书。并且上传到http://localhost:8080/upload/html,照做即可。
登录进Saiku之后,在控制台-Datasourcemanager-add data source添加本地数据库连接信息即可。至此mysql-mondrian-saiku的三层多维数据分析平台构建完成。
5. 仿真数据集的准备
本例采用网络上的销售-产品数据集作为多维数据分析的数据源。数据结构为雪花模型。由一张事实表sale,三张维度表product,producttye,Customer三张维度表构成。包含customer和product两个维度,其中product的外键proTypeId指向ProductType的主键proTypeId构成雪花模型。包含单价unitPrice和销售量number两个度量。具体数据结构见下图。
建表和数据装在的构成就不在做过多的介绍。
6. Mondrian schema3.0/4.0demo演示
结合saiku界面的实例和遇到的大坑演示。
7. 使用过程遇到的坑
l 查看mondrian生成的mysql语句需要配置
default-storage-engine=INNODB
general_log=on
general_log_file=D:\mysql-5.6.34-winx64\data\mysql.log
l mondrain schema4.0特性重点分析
1. 元素<physicalShema>必须要有:指定cube涉及到设事实表和维表的key和关联关系,但是physicalSchema下面的table必须要:指定cube需要的事实表和维度表,link不是必须,可由<Dimension>下面的<Join>属性,<MeasureGroups>下面的<DimensionLinks>下面的<ForeignKeyLink>代替。
2. <Dimension>下面的<Join>属性也不是必须要有:指定雪花模型的维度表之间的关联关系。可在<physicalSchema>下的<link>中指定维表之间的关联关系。
3. <MeasureGroups>下面的<DimensionLinks>下面的<ForeignKeyLink>必须要有:指定事实表里面的measures(度量)和维表之间的关联关系。也就是事实表和维度表之间的关联关系。
4. <View>(3.0)和<Query>(4.0)的区别:<Query>和<View>功能上一样,但是Query的语法和官网上有点区别,推荐用View。
5. 使用<View>报错:Caused by: java.sql.SQLException: No suitable driver found for jdbc.mysql://localhost:3306/test
解决:链接写错了。
6.使用<Query>报错:Caused by: org.eigenbase.xom.XOMException: In Schema: In PhysicalSchema: In Query: Attribute 'alias' is unset and has no default value。
解决:name改alias(与官网有区别)。
7.将<Query>的name属性改为alias报错:Caused by: java.sql.SQLException: No suitable driver found for jdbc.mysql://localhost:3306/test
解决:链接写错了。
8. mondrainShema的大坑
(1) 错误:Caused by:com.mysql.jdbc.exceptions.jdbc4. MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group by `producttype`.`proTypeName` order by ISNULL(`producttype`.`proTypeName`' at line 1。
解决:解决:physicalSchema中涉及的要用到的表的定义中有个单词写错了,(Column)写成了Cloumn。
(2) 错误:定义了Hierarychy,却说attribute必须要有一个Hierarchy,
解决:physicalSchema中涉及的要用到的表的定义中有个单词写错了,(Column)写成了Cloumn。
8. 虚拟立方体visualCube(3.0)
9. 性能优化aggregateTable
来源:oschina
链接:https://my.oschina.net/u/3323164/blog/1801841