点击打开链接关于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