点击打开链接关于OLAP服务引擎的模块开发,已大致完成,此次工作也能够放1段落,迎来51小长假。
本文对本次开发做1次小的总结,全部eway项目的整体架构图以下所示,OLAP引擎这块用的是开源框架mondrian,也是本人负责的。
那末本模块所要做的事情,就是接受从云端服务总线上传输过来的JSON格式,并进行相应的业务逻辑判断、查询并返回JSON格式。
因此,模块的开发任务,以下:
1.JSON报文的解析与生成;
2.数据仓库的建立(mysql关系数据库中建立相对应的事实表和维度表)
3.逻辑模型的生成(通过schema-workbench工具生成,它终究是1个xml文件)
4.履行相干MDX语句,对逻辑模型进行查询操作。
1、任务的细化,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;
....
}
2、数据仓库的建立
本项目中有以下维度:时间维、地区维和能源种类维
全部数据仓库是建立在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 '时间--1周中的日数,0为星期1,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');
3、建立与之对应的逻辑模型
可以参考之前的文章http://blog.csdn.net/qzp1991/article/details/44017161
4、相干的MDX语句
可以查看之前的文章http://blog.csdn.net/qzp1991/article/details/44776523