记天溯实习期间关于mondrian的开发小结

点击打开链接关于OLAP服务引擎的模块开发,已经大致完成,此次工作也可以放一段落,迎来五一小长假。

本文对本次开发做一次小的总结,整个eway项目的整体架构图如下所示,OLAP引擎这块用的是开源框架mondrian,也是本人负责的。

那么本模块所要做的事情,就是接受从云端服务总线上传输过来的JSON格式,并进行相应的业务逻辑判断、查询并返回JSON格式。

因此,模块的开发任务,如下:

1.JSON报文的解析与生成;

2.数据仓库的建立(mysql关系数据库中建立相对应的事实表和维度表)

3.逻辑模型的生成(通过schema-workbench工具生成,它最终是一个xml文件)

4.执行相关MDX语句,对逻辑模型进行查询操作。

一、任务的细化,JSON格式的定义及解析,我们采用的是开源框架FastJSON,它提倡建立与JSON格式相对应的数据结构

{
    "Olaps": [{
        "tenant": "tiansu",
        "measurements": [
            {
                "measureName":"sum",
		"measureName":"avg"
            }
        ],
        "dimentions": [
            {
		"dim":"region",
                "Levels": [
                    {
                        "province": "江苏",
                        "city": "南京",
                        "district": "玄武",
                        "building": "1号建筑",
                        "area": "1号区域"
                    }
                ]
            },
            {
		"dim":"time",
                "Levels": [
                    {
                        "year": "2015",
                        "month": "1",
			"week":"2",
			"day":"21",
			"hour":"13",
			"minute":"24"
                    }
                ]
            },
            {
		"dim":"category",
		"hierarchys":[{"hierarchy":"category_by_type"}],
                "Levels": [
                    {
                        "categoryTypeName": "动力"
                    }
                ]
            }
        ],
	"conditions":[
	    {
		"dim":"region",
		"hierarchys":[{"hierarchyName":"region_by_area"}],
                "Levels": [
                    {
                        "province": "江苏",
                        "city": "南京",
                        "district": "玄武",
                        "building": "1号建筑",
                        "area": "1号区域"
                    }
                ]
            },
            {
		"dim":"time",
		"hierarchys":[{"hierarchyName":"time_by_day"},{"hierarchyName":"time_by_week"}],
                "Levels": [
                    {
                        "year": "2015",
                        "month": "1",
			"week":"2",
			"day":"21",
			"hour":"13",
			"minute":"24"
                    }
                ]
            },
            {
		"dim":"category",
		"hierarchys":[{"hierarchyName":"category_by_type"}],
                "Levels": [
                    {
                        "categoryTypeName": "动力"
                    }
                ]
            }
	]
    }
    ]
}

{"Olaps":[ ]}对于这种数据结构,我是这样来构造它的javaBean的,首先通过类Eway来表示{ },并将olaps这个数组包含进去。[ ]表示数组。

而对与{"Levels":[{""year": "2015", "month": "1" } ] }这种形式的数据结构,我们用list<Map<String,String>>来表示。因为数组中存在太多的变量。

下面是以上整个Json对应的JavaBean文件

public class Eway {

	private List<Olap> olaps;

	public List<Olap> getOlaps() {
		return olaps;
	}

	public void setOlaps(List<Olap> olaps) {
		this.olaps = olaps;
	}
}
public class Olap {

	private String tenant;
	private List<Measurement> measurements;
	private List<Dimention> dimentions;
	private List<Condition> conditions;
        ....
}
public class Measurement {

	private String measureName;

	public String getMeasureName() {
		return measureName;
	}

	public void setMeasureName(String measureName) {
		this.measureName = measureName;
	}
}
public class Dimention {

	private String dim;
	private List<Map<String,String>> levels;
        .....
}
public class Condition {

	private String dim;
	private List<Hierarchy> hierarchys;
	private List<Map<String,String>> levels;
        ....
}

二、数据仓库的建立

本项目中有如下维度:时间维、地区维和能源种类维

整个数据仓库是建立在Mysql关系数据库之中的,建表语句如下:

DROP TABLE IF EXISTS `dim_class`;
CREATE TABLE `dim_class` (
  `class_id` int(10) unsigned NOT NULL auto_increment,
  `class` varchar(255) default NULL COMMENT '分类名称',
  PRIMARY KEY  (`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of dim_class
-- ----------------------------
INSERT INTO `dim_class` VALUES ('1', '动力');
INSERT INTO `dim_class` VALUES ('2', '照明');
INSERT INTO `dim_class` VALUES ('3', '空调');
INSERT INTO `dim_class` VALUES ('4', '其他');

-- ----------------------------
-- Table structure for `dim_org`
-- ----------------------------
DROP TABLE IF EXISTS `dim_org`;
CREATE TABLE `dim_org` (
  `org_id` int(10) unsigned NOT NULL auto_increment COMMENT '组织维主ID',
  `group` varchar(255) default NULL COMMENT '组织--集团',
  `company` varchar(255) default NULL COMMENT '组织--公司',
  `branch` varchar(255) default NULL COMMENT '组织--分支',
  `department` varchar(255) default NULL COMMENT '组织--部门',
  PRIMARY KEY  (`org_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of dim_org
-- ----------------------------
INSERT INTO `dim_org` VALUES ('1', '天溯', '研发中心', '系统软件部', '通讯组');
INSERT INTO `dim_org` VALUES ('2', '天溯', '研发中心', '系统软件部', '企业组');
INSERT INTO `dim_org` VALUES ('3', '天溯', '研发中心', '系统软件部', '云端组');
INSERT INTO `dim_org` VALUES ('4', '天溯', '研发中心', '系统软件部', '应用组');
INSERT INTO `dim_org` VALUES ('5', '天溯', '研发中心', '产品部', '测试组');
INSERT INTO `dim_org` VALUES ('6', '天溯', '研发中心', '产品部', 'UCD');
INSERT INTO `dim_org` VALUES ('7', '天溯', '研发中心', '产品部', '产品规划组');
INSERT INTO `dim_org` VALUES ('8', '天溯', '销服中心', '交付运维部', '工程技术组');
INSERT INTO `dim_org` VALUES ('9', '天溯', '销服中心', '交付运维部', '深化设计组');
INSERT INTO `dim_org` VALUES ('10', '天溯', '销服中心', '交付运维部', '运维服务组');

-- ----------------------------
-- Table structure for `dim_region`
-- ----------------------------
DROP TABLE IF EXISTS `dim_region`;
CREATE TABLE `dim_region` (
  `region_id` int(10) unsigned NOT NULL auto_increment,
  `province` varchar(255) default NULL COMMENT '区域--省',
  `city` varchar(255) default NULL COMMENT '区域--市',
  `district` varchar(255) default NULL COMMENT '区域--区县',
  `building` varchar(255) default NULL COMMENT '区域--建筑体',
  `area` varchar(255) default NULL COMMENT '区域--建筑内功能分区',
  PRIMARY KEY  (`region_id`)
) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of dim_region
-- ----------------------------
INSERT INTO `dim_region` VALUES ('1', '江苏', '南京', '玄武', '1号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('2', '江苏', '南京', '白下', '1号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('3', '江苏', '南京', '玄武', '1号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('4', '江苏', '南京', '玄武', '1号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('5', '江苏', '南京', '玄武', '2号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('6', '江苏', '南京', '玄武', '2号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('7', '江苏', '南京', '玄武', '2号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('8', '江苏', '南京', '玄武', '3号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('9', '江苏', '南京', '玄武', '3号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('10', '江苏', '南京', '玄武', '3号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('11', '江苏', '南京', '白下', '1号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('12', '江苏', '南京', '白下', '1号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('13', '江苏', '南京', '白下', '1号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('14', '江苏', '南京', '建邺', '1号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('15', '江苏', '南京', '建邺', '1号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('16', '江苏', '南京', '建邺', '1号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('17', '江苏', '南京', '建邺', '2号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('18', '江苏', '南京', '建邺', '2号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('19', '江苏', '南京', '建邺', '2号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('20', '江苏', '南京', '建邺', '3号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('21', '江苏', '南京', '建邺', '3号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('22', '江苏', '南京', '建邺', '3号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('23', '江苏', '南京', '建邺', '4号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('24', '江苏', '南京', '建邺', '5号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('25', '江苏', '南京', '建邺', '6号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('26', '湖南', '长沙', '开福', '1号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('27', '湖南', '长沙', '开福', '1号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('28', '湖南', '长沙', '开福', '1号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('29', '湖南', '长沙', '开福', '2号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('30', '湖南', '长沙', '开福', '2号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('31', '湖南', '长沙', '开福', '2号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('32', '湖南', '长沙', '开福', '3号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('33', '湖南', '长沙', '开福', '3号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('34', '湖南', '长沙', '开福', '3号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('35', '湖南', '长沙', '开福', '4号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('36', '湖南', '长沙', '开福', '5号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('37', '湖南', '长沙', '开福', '6号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('38', '湖南', '长沙', '雨花', '1号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('39', '湖南', '长沙', '雨花', '1号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('40', '湖南', '长沙', '雨花', '1号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('41', '湖南', '长沙', '雨花', '2号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('42', '湖南', '长沙', '雨花', '2号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('43', '湖南', '长沙', '雨花', '2号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('44', '湖南', '长沙', '雨花', '3号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('45', '湖南', '长沙', '雨花', '3号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('46', '湖南', '长沙', '雨花', '3号建筑', '3号区域');
INSERT INTO `dim_region` VALUES ('47', '湖南', '长沙', '雨花', '4号建筑', '1号区域');
INSERT INTO `dim_region` VALUES ('48', '湖南', '长沙', '雨花', '5号建筑', '2号区域');
INSERT INTO `dim_region` VALUES ('49', '湖南', '长沙', '雨花', '6号建筑', '3号区域');

-- ----------------------------
-- Table structure for `dim_time`
-- ----------------------------
DROP TABLE IF EXISTS `dim_time`;
CREATE TABLE `dim_time` (
  `time_id` int(10) unsigned NOT NULL auto_increment COMMENT '时间维度ID',
  `year` int(10) default NULL COMMENT '时间--年',
  `quarter` int(10) default NULL COMMENT '时间--季度',
  `month` int(10) default NULL COMMENT '时间--月',
  `day` int(10) default NULL COMMENT '时间--日',
  `week` int(10) default NULL COMMENT '时间--周',
  `weekday` int(10) default NULL COMMENT '时间--一周中的日数,0为星期一,6为星期日',
  `hour` int(10) default NULL COMMENT '时间--小时,采用24小时制',
  `minute` int(10) default NULL COMMENT '时间--分钟',
  PRIMARY KEY  (`time_id`)
) ENGINE=InnoDB AUTO_INCREMENT=349 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of dim_time
-- ----------------------------
INSERT INTO `dim_time` VALUES ('1', '2015', '1', '1', '1', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('2', '2015', '2', '1', '2', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('3', '2015', '3', '1', '3', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('4', '2015', '4', '1', '4', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('5', '2015', '5', '1', '5', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('6', '2015', '6', '1', '6', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('7', '2015', '5', '2', '7', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('8', '2015', '6', '1', '8', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('9', '2015', '1', '1', '9', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('10', '2015', '1', '1', '10', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('11', '2015', '1', '1', '11', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('12', '2015', '1', '1', '12', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('13', '2015', '1', '1', '13', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('14', '2015', '1', '1', '14', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('15', '2015', '1', '1', '15', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('16', '2015', '1', '1', '16', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('17', '2015', '1', '1', '17', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('18', '2015', '1', '1', '18', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('19', '2015', '1', '1', '19', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('20', '2015', '1', '1', '20', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('21', '2015', '1', '1', '21', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('22', '2015', '1', '1', '22', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('23', '2015', '1', '1', '23', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('24', '2015', '1', '1', '24', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('25', '2015', '1', '1', '25', null, null, '0', '0');
INSERT INTO `dim_time` VALUES ('26', '2015', '1', '1', '26', null, null, '0', '0');

三、建立与之对应的逻辑模型

可以参考之前的文章http://blog.csdn.net/qzp1991/article/details/44017161

四、相关的MDX语句

可以查看之前的文章http://blog.csdn.net/qzp1991/article/details/44776523

时间: 2024-10-08 18:27:27

记天溯实习期间关于mondrian的开发小结的相关文章

【实习记】2014-08-20实习的mini项目总结

实习项目总结文档 项目介绍 项目逻辑很简单,只有几个页面,只能登录,查看,支付和退款.主要作用是熟悉C++的cgi的web服务开发方式. 项目页面截图 图一:登录页面 图二:买家查看 图三:买家支付 图五:卖家查看 图六:卖家退款 准备:一个星期 8月28日,第1天,入域,安装rtx,qq,wps,管家.不太顺利,可能我比较笨,用了半天.安装git,vim,firefox,chrome.发现git必须配置http://web-proxy.oa.com:8000代理.颇不如意,挺折腾人.导师根据实

实习期间问题总结

主要针对实习期间,接触的部分问题进行总结,后续会不间断的补充,作为实习期间的回顾. 1,git ,github和gitlab的关系 git 是一个版本控制工具,github是一个用git做版本控制的项目托管平台,他是一个网站,提供给用户空间创建git仓库,保存用户的一些数据文档或代码等.gitlab是基于git的项目管理软件,gitlab是一个用于仓库管理系统的开源项目,使用git作为代码管理工具,并在此基础上搭建起来的web服务.三者都是基于git的,可以说是git的衍生品. 2,关于SSH密

答读者问(7):有关实习、毕业论文及软件开发和测试的关系等问题

最近收到一位研究生朋友的邮件,让我想到自己研究生毕业之前,也曾有过很多的疑惑,希望得到过来人的解答.互联网不仅是我们最好的老师,同时也是最好的桥梁.我们都要感谢并善于利用它. 闲话不说,言归正传.邮件原文如下: 周前辈,您好 我是XXX研究生,我叫XXX.专业是信息与通信工程.现在研二,过了暑假马上就研三了.我在CSDN上无意间看到您的一些文章,写的很好,感触很多.所以就一直在关注您! 下面我简单说下我的情况,我本科和研究生到目前,还没有工作过,也没有实习过.这个暑假,我找了一个实习,是XXX公

实习期间移动端做时总结

图片要显示成设计稿的样式(图片名为:inset.png) 但实际上在psd裁剪出来后,图片的大小是773X305px 为了让图片显示出与设计稿一样的效果 即代码这样写: 1 <div class="pic"></div> 2 .pic{ 3 background: url(../i/inset.png) 0 0 no-repeat; 4 width: 386.5px;/*no*/设计成了原来图片宽度的一半 5 height:157.5px;/*no*/ 设计成了

朗科实习期间心得笔记(六)

与用户账户和组账户相关的文件:/etc/passwd/etc/group/etc/shadow/etc/gshadow/etc/default/useradd/etc/login.defs/etc/skel(directory) /etc/passwd:用户名解析库root:x:0:0:root:/root:/bin/bash   1  2 3  4   5         6     7    1字段:用户账户登陆名称2字段:使用 X 表示密码占位符3字段:用户账户的UID4字段:用户账户的G

朗科实习期间心得笔记(八)

其他的文本处理命令:    wc命令    cut命令   在文件的每一行中提取片断   注意:能够被cut命令修剪的文本文件或数据内容,一般是具有某种特定格式或结构的文本文件或数据内容:如:/etc/passwd   cut [OPTION]... [FILE]...   常用选项   -d:指定在实施修剪操作时所使用的字段分隔符号,默认是TAB(空白字符):   -f:根据我们指定的字段分隔符号来指定要保留的字段编号的列表:     LIST称为字段列表,地址定界,其书写方法:      

朗科实习期间笔记心得(十)

bash脚本编程 case选择分支结构case 词 in [模式 [| 模式]...) 命令 ;;]... esac  在脚本中使用的case结构:     case $(VAR-NAME) in      PATTERN1)        COMMAND        ...        ::      PATTERN2)        COMMAND        ...        ::      ...    esac PATTERN可以是下列几类字符:    1.普通文本字符   

实习期间的一些思考整理(6)2018.4.19~4.20

青云诀游戏体验日报-2018.4.19 今日关键点:新老玩家的矛盾 今天试着分析青云诀新老玩家之间矛盾的原因. 1.    利益问题 游戏刚出来时,都希望玩的人多点,所以都会欢迎新人:当游戏到了后期,人数多起来,资源的获取就越发艰难(比如竞技场排行奖励.抢BOSS等),这时候就会发生利益冲突,新老玩家的矛盾就出来了. 2.    追赶机制问题 随着游戏版本的更替,新手要想追上老手的脚步是越来越难的:而对于那些土豪新手,花钱就是为了迅速追平与老手的差距(或者说追上新版本的进度).针对这些问题,游戏

实习期间的一些思考整理(5)2018.4.17~4.18

青云诀游戏体验日报-2018.4.14 今日关键点:无 主要是把玩青云诀的过程中不易长篇大论的东西统一写一写. 1.     主线剧情,自动交任务的时间是15秒,赏金等挂机玩法自动交任务的时间是5秒,仙盟任务不能自动交. 主线设计为15秒是为了让玩家看清楚剧情(感觉还是太长了,10秒足以):赏金等挂机玩法讲究的是效率,没什么背景内容需要玩家看,所以设计为5秒加快完成速度:仙盟任务我想不通为什么不能自动交接-.按道理这也没什么需要玩家集中注意力玩的点啊. 2.     玩家整个界面分两个模式:1.