Mondrian测试数据库footmart生成记

现在要搞一些数据分析(OLAP)相关的数据,恰好mondrian提供了一个用于测试的footmart数据集,这个数据库主要记录了一些关于销售数据的事实表和维度表,内容很丰富,并且提供了foorMart.xml文件,这个文件定义了所有需要使用的cube的定义集合,但是我们现在用自己开发的系统定义cube,所以这个配置文件应该就用不上了,主要需要生成这个数据库的数据,首先将它放到mysql上吧,然后再将它通过sqoop导入到hive中,用我们的OLAP报表系统定义cube和报表执行查询,这一套流程走下来基本上能把OLAP查询的基本流程走通了,接下来的主要工作还是在如何优化多维查询的性能。

首先这个数据库数据的生成是通过程序执行得到的,首先我们需要下载mondrian的某个版本(根据官方文档),下载地址在http://sourceforge.net/projects/mondrian/,但是有个问题就是在3.8.0版本之后只能找到jar包了,不能够找到完整的那个zip包,所以我就舍弃了最新的版本,下载一个比较新的3.7.0版本的zip包(http://sourceforge.net/projects/mondrian/files/mondrian/mondrian-3.7.0/mondrian-3.7.0.0-752.zip,大小为119M),解压之后在testsrc/main/mondrian/test/loader目录下有一个MondrianFoodMartLoader.java文件,这个java程序就是为了生成测试数据的,当然测试数据都是存放在一个.sql文件里面,这个文件在demo目录下,文件名是FoodMartCreateData.zip,将它解压过之后,编译MondrianFoodMartLoader程序,然后运行如下命令:

-verbose -tables -data -indexes -jdbcDrivers=com.mysql.jdbc.Driver  -outputJdbcURL=jdbc:mysql://172.17.3.102:16666/foodmart  -outputJdbcUser=root -outputJdbcPassword=root -outputJdbcSchema=foodmart -outputJdbcBatchSize=50 -inputFile=C:\Users\Administrator\Desktop\FoodMartCreateData.sql

根据参数名可以看出参数的含义分别是:

-verbose   详细输出日志信息

-tables     如果表不存在则创建表

-data       如果数据存在则删除全部数据在load,如果不选则不导入数据

-indexes   决定是否创建索引

-jdbcDrivers    数据库的driver

-outputJdbcURL   导出的数据库url

-outputJdbcUser、 -outputJdbcPassword   导出数据库的用户名和密码

-outputJdbcSchema  目标数据库名,如果不指定则使用默认的

-outputJdbcBatchSize    是否批量插入,默认是50条记录一批进行插入

-inputFile                 导入的数据文件,就是之前在mondrian中提供的解压之后的.sql文件路径

创建完成之后有如下一些表:

mysql> show tables;
+-------------------------------+
| Tables_in_foodmart            |
+-------------------------------+
| account                       |
| agg_c_10_sales_fact_1997      |
| agg_c_14_sales_fact_1997      |
| agg_c_special_sales_fact_1997 |
| agg_g_ms_pcat_sales_fact_1997 |
| agg_l_03_sales_fact_1997      |
| agg_l_04_sales_fact_1997      |
| agg_l_05_sales_fact_1997      |
| agg_lc_06_sales_fact_1997     |
| agg_lc_100_sales_fact_1997    |
| agg_ll_01_sales_fact_1997     |
| agg_pl_01_sales_fact_1997     |
| category                      |
| currency                      |
| customer                      |
| days                          |
| department                    |
| employee                      |
| employee_closure              |
| expense_fact                  |
| inventory_fact_1997           |
| inventory_fact_1998           |
| position                      |
| product                       |
| product_class                 |
| promotion                     |
| region                        |
| reserve_employee              |
| salary                        |
| sales_fact_1997               |
| sales_fact_1998               |
| sales_fact_dec_1998           |
| store                         |
| store_ragged                  |
| time_by_day                   |
| warehouse                     |
| warehouse_class               |
+-------------------------------+

可以看出这里面的store_sales、store_cost、unit_sales可以作为度量的列,然后将他们使用某些聚合方式计算就可以作为度量了。其余的例如product_id、time_id、customer_id、promotion_id、store_id是其它维度表的主键,通过这个id来关联维度表,例如与time_id关联的表是time_by_day,表结构如下:

| time_by_day | CREATE TABLE `time_by_day` (
  `time_id` int(11) NOT NULL,
  `the_date` datetime DEFAULT NULL,
  `the_day` varchar(30) DEFAULT NULL,
  `the_month` varchar(30) DEFAULT NULL,
  `the_year` smallint(6) DEFAULT NULL,
  `day_of_month` smallint(6) DEFAULT NULL,
  `week_of_year` int(11) DEFAULT NULL,
  `month_of_year` smallint(6) DEFAULT NULL,
  `quarter` varchar(30) DEFAULT NULL,
  `fiscal_period` varchar(30) DEFAULT NULL
) ENGINE=NTSE DEFAULT CHARSET=utf8 |

这样我们就可以设定time维度,这个维度关联的维度表就是time_by_day ,可以选取该表中可以枚举的列作为维度的级别(例如the_month、the_day、the_year、day_of_month、week_of_year等),这些级别之间可以有层级的关系,某一个级别是另外一个级别的父级,在当前的项目中一个维度下只支持一个级别有一个父级和一个子级的关系。例如year这个级别对应的是‘the_year’这一列,它的子级可以是‘quarter’列作为级别,例如在当前的表中‘the_year’这一列只有两个取值:

mysql> select distinct the_year  from time_by_day;
+----------+
| the_year |
+----------+
|     1998 |
|     1997 |
+----------+

而‘quarter’列有四个取值:

mysql> select distinct quarter  from time_by_day;
+---------+
| quarter |
+---------+
| Q1      |
| Q2      |
| Q3      |
| Q4      |
+---------+

当设定这个级别之间的关系之后,可以在指定year这个级别之后对其执行下钻操作,这样就会计算year=1997下quarter为每一个取值时的度量值,因此,级别的设定主要是为了设定对于同一个维度不同粒度的聚合方式(按照年、按照月or按照季度)。当然有了这个层级的关系,为上卷和下钻也提供了操作的基础。

在cube的定义中主要的就是维度和度量的定义了,当然在表里面我们可以看到一些以agg开头的表,这些表的创建是为了mondrian执行的时候优化的,在mondrian提供的FoodMart.xml文件中可以看到文件的开头制定了一些聚合表,这些聚合表相当于对于一些度量按照不同维度执行的预计算,当执行查询的时候如果匹配可以从聚合表中查询而不用再进行动态的计算,当然这样的与计算对于数据更新还是有一定的代价的。

目前基于mondrian的OLAP查询引擎面临的最大问题就是性能的问题,因为大部分的mdx查询操作都是动态得翻译成sql,然后从元数据库中执行查询操作,这难免会造成性能低下,尤其是对于不面向响应时间的hive数据库,查询速度那是相当的慢,目前的优化方式大体上是执行预计算的方式,在创建cube的时候预先将整个cube或者可以支撑整个cube的所有度量值都计算出来,查询的时候从预计算的结果中查询或者再进行聚合,由于预计算的结果可以存放在内存或者性能更高的key-value数据库中,这种方式比直接从元数据库查找的性能会有一定的提升,但是当数据量比较大的时候预计算的结果可能会非常大,如果节省缓存的空间也是面临的一个大问题。

时间: 2024-10-10 05:52:16

Mondrian测试数据库footmart生成记的相关文章

seam2.2根据已有数据库(postgresql)生成项目

首先呢,这是我向同哥请教的一个文题,然后同哥把整个过程给我解答了一遍,谢谢同哥的乃森及引针啦---- seam2.2根据已有数据库(postgresql)生成项目 一,建数据库 进入pgAdmin新建一个数据库然后用eclipse的插件ErMaster导出sql或者是自己手写sql新建数据表 ,这里新建了一个名为test的数据库 里面有两个表,member和department,为多对一的关系,注意不要忘了设置主键 二,进入seam目录运行 ./seam setup ./seam create-

javaweb学习总结(三十七)——获得MySQL数据库自动生成的主键

测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: 1 package me.gacl.demo; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import me.gacl.utils.JdbcU

eclipse从数据库逆向生成Hibernate实体类(eclipse中反向生成hibernate实体类+jpa注释)

eclipse从数据库逆向生成Hibernate实体类 做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再"自己"建立一变VO.意思是,在项目设计时,要么根据需求分析建立实体类,由正向生成数据库表:要么就先进行数据库表设计,再逆向生成实体类.没有说进行完任意一方的设计后再去花时间去自己匹配建立另一方的设计. 原因是: 1. 1.5倍工作量,浪费时间.(时间对公司来说很重要) 2. 无法

用C#从数据库动态生成AdminLTE菜单的一种方法

用C#从数据库动态生成AdminLTE菜单的一种方法 当前的应用设计风格趋于Flat扁平化,很多基于BootStrap实现了很多UI非常漂亮的管理界面(Bootstrap admin template). 此核心文件开源在Github:https://github.com/JackWangCUMT/AdminLTE-Menu-Generate.首先看一下主界面: 查看左边导航的菜单html结构(下面代码有错误,HTML自定义属性直接用空格进行分割,而不是,号进行分割,不然jquery获取定义属性

MyEclipse 从数据库反向生成Hibernate实体类

第一个大步骤 window-->open Perspective-->MyEclipse Java Persistence 进行了上面的 操作后会出现一个视图DB Brower:MyEclipse Derby,点击右键新建一个在出现的面板中,driver template中选择MySQL的,driver name自己写个随便的,Connection URL就写平常的JDBC中的URL,用户密码也是的,接下来就是add Jars了这个JAR大家很清楚肯定是MYSQL的驱动包了测试下是否可用,可用

[转]eclipse借助hibernate tool从数据库逆向生成Hibernate实体类

如何从数据库逆向生成Hibernate实体类呢??? 1. 首先,要在eclipse中采用自带的数据库管理器(Data Management),连通你的数据库: 然后选择数据库,这里用的oracle,然后给个名字,如MyOracle. 点击下图中按钮,新建一个数据库驱动的配置. 选择数据库版本,这里是oracle 10g版本,可以为该配置另起个名字. 然后选择相应数据库版本的jar包. 下面就是依据自身情况填写数据库连接配置了. 接下来,完善Properties下的General选项卡内容,同样

Visio 2010对MySQL数据库反向工程生成ER数据库模型图

Visio 2010对MySQL数据库反向工程生成ER数据库模型图 1.首先需要从Mysql下载用于数据库链接的驱动ODBC 下载地址是:http://dev.mysql.com/downloads/connector/odbc/ 根据相应的版本下载即可,下载完后直接在本地安装 2.启动Visio2010(其他版本自学) 新建文档的时候在模板类别里面选"软件和数据库",如下图 然后会跳到"选择模板"里面,直接选"数据库模型图",如下图 3.在上面

MyEclipse中hibernate通过数据库逆向生成java实体类

1.点击window->show view->DB Browser,然后出现如下窗口 右键空白处选择New,弹出如下窗口: 先点击Add JARs按钮,选择相应数据库的JDBC driver(因为我用的是MySQL,所以选择的是之前已经下好的JDBC driver),添加完JDBC driver后.然后选择Driver template,Driver name(任意填写),Connection URL.数据库用户名.数据库登录密码,然后点击点击Test Driver(测试一下数据库是否连接成功

【转】Eclipse从数据库逆向生成Hibernate实体类

原文地址:http://blog.csdn.net/wangpeng047/article/details/6877720 做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再"自己"建立一变VO.意思是,在项目设计时,要么根据需求分析建立实体类,由正向生成数据库表:要么就先进行数据库表设计,再逆向生成实体类.没有说进行完任意一方的设计后再去花时间去自己匹配建立另一方的设计. 原因是: