记天溯实习期间关于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');

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

可以参考之前的文章

四、相关的MDX语句

可以查看之前的文章

巨龟千岁,却也平淡无奇;昙花瞬间,却能绚丽无比。

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

相关文章:

你感兴趣的文章:

标签云: