OLAP(On-Line Analysis Processing)在线分析处理是一种共享多维信息的快速分析技术;OLAP利用多维数据库技术使用户从不同角度观察数据;OLAP用于支持复杂的分析操作,侧重于对管理人员的决策支持,可以满足分析人员快速、灵活地进行大数据复量的复杂查询的要求,并且以一种直观、易懂的形式呈现查询结果,辅助决策。
上面是OLAP的一些不同的解释,本文将从以下几个方面介绍OLAP。
先介绍一个OLAP的引擎Mondrian的使用,然后再根据这个实例来介绍整个的OLAP。
http://cdnetworks-kr-1.dl.sourceforge.net/project/mondrian/mondrian/mondrian-3.3.0.14703/mondrian-3.3.0.14703.zip解压。找到lib目录下面的mondrian.war,将其复制到Tomcat下面运行。输入:http://localhost:8080/mondrian/可以看到Mondrian的界面,点击其中的Mondrian Examples可以看到相应的示例。界面如下:
1、创建数据库(MySQL),为简单这里只创建了一张表,对于维度和事实表我们在逻辑里面区分。模拟数据自行添加。
CREATE TABLE `person` ( `userid` varchar(100) , `department` varchar(100) , `username` varchar(100), `sex` varchar(100) , `nationality` varchar(100), `post` varchar(100), `zyjslb` varchar(100), `zyjsdj` varchar(100) , `zhixi` varchar(100), `xueli` varchar(100) , `age` int(10) , PRIMARY KEY (`userid`) )
2、创建数据立文体(CUBE)。在Mondrian里面的cube是以XML的形式定义的,他有一个GUI工具workbench来制作cube,不过个人感觉这个GUI工具非常不好用,不如手写。新建立personDemo.xml如下。
<?xml version="1.0" encoding="UTF-8"?> <Schema name="Mondrian"> <Cube name="Person"> <Table name="PERSON" /> <Dimension name="部门" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有部门" > <Table name="PERSON" alias="a"/> <Level name="部门" column="DEPARTMENT" uniqueMembers="true" /> <Level name="姓名" column="USERNAME" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="性别" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有性别"> <Table name="PERSON" alias="b" /> <Level name="性别" column="SEX" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="专业技术资格类别" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有专业技术资格类别"> <Table name="PERSON" alias="c" /> <Level name="资格类别" column="ZYJSLB" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="专业技术资格等级" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有专业技术资格等级"> <Table name="PERSON" alias="d" /> <Level name="资格等级" column="ZYJSDJ" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="职系" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有职系"> <Table name="PERSON" alias="e" /> <Level name="职系" column="ZHIXI" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="民族" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有民族"> <Table name="PERSON" alias="f" /> <Level name="民族" column="NATIONALITY" uniqueMembers="true" /> </Hierarchy> </Dimension> <Dimension name="学历" foreignKey="USERID" > <Hierarchy hasAll="true" primaryKey="USERID" allMemberName="所有学历"> <Table name="PERSON" alias="g" /> <Level name="学历" column="XUELI" uniqueMembers="true" /> </Hierarchy> </Dimension> <Measure name="人数" column="USERID" aggregator="distinct count" /> </Cube> </Schema>
3、新建立一JSP文件,命名随便,这里命名为person.jsp
<%@ page session="true" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> <%@ taglib uri="http://www.tonbeller.com/jpivot" prefix="jp" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <jp:mondrianQuery id="query01" jdbcDriver="com.mysql.jdbc.Driver" jdbcUrl="jdbc:mysql://localhost:3306/olaptest" catalogUri="/WEB-INF/queries/personDemo.xml" jdbcUser="root" jdbcPassword="root" connectionPooling="false"> select NON EMPTY {[Measures].[人数]} on columns, NON EMPTY {([部门].[所有部门],[职系].[所有职系],[专业技术资格类别].[所有专业技术资格类别],[专业技术资格等级].[所有专业技术资格等级],[学历].[所有学历],[民族].[所有民族],[性别].[所有性别])} ON rows from Person </jp:mondrianQuery> <c:set var="title01" scope="session">人员结构多维分析</c:set>
4、复制上面XML和JSP文件到WEB-INF/queries目录下面。在浏览器中输入:
http://localhost:8080/mondrian/testpage.jsp?query=person访问,界面如下
变量是数据度量的指标,是数据的实际意义,即描述数据“是什么”。像上面示例中的人数。
维度是描述与业务主题相关的一组属性,单个属性或属性集合可以构成一个维。如上面示例中的学历、民族、性别等都是维度。
一个维往往可以具有多个层次,例如时间维度分为年、季度、月和日等层次,地区维可以是国家、地区、省、市等层次。这里的层次表示数据细化程度,对应概念分层。后面介绍的上钻操作就是由低层概念映射到高层概念。概念分层可除根据概念的全序和偏序关系确定外,还可以通过对数据进行离散化和分组实现。
若维是多层次的,则不同的层次的取值构成一个维成员。部分维层次同样可以构成维成员,例如“某年某季度”、“某季某月”等都可以是时间维的成员。
多维数组用维和度量的组合表示。一个多维数组可以表示为(维1,维2,……,维n,变量),例如(部门,职系、民族、性别,人数)组成一个多维数组。
多维数组的取值。当多维数组中每个维都有确定的取值时,就唯一确定一个变量的值。数据单元可以表示为(维1成员,维2成员,……,维N成员,变量的值),例如(人事教育部,技能,回族,男,1人)表示一个数据单元,表示人事教育部职系是技能的回族男性有1人。
事实是不同维度在某一取值下的度量,例如上述人事教育部职系是技能的回族男性有1人就表示在部门、职系、民族、性别四个维度上企业人数的事实度量,并且在为人数事实中包含部门维度人事教育部这一个维度层次,如果将人数事实的所有维度考虑在内,就构成有关人数的多维分析立方体。
电子数据表与OLAP相比,不具备OLAP的多维性、层次、维度计算以及结构与视图分离等特点。
OLAP比较常用的操作包括对多维数据的切片与切块、上钻(drill-up)与下钻(drill-down)以下旋转(rotate)等。此外,OLAP还能对多维数据进行深加工。OALP的这些操作使用户能够从多个视角观察数据,并以图形、报表等多种形式展示,从而获取隐藏在数据中的信息。
选定多维数组的一个维成员做数据分割的操作称为该维上的一个切片。通常把多维数组中选定一个二维子集的操作视为切片,假设选定的维i上的某个维成员Vi,则此多维数组子集可以定义为(维V1……,维Vi,维N,变量)。当某维只取一个维成员时,便得到一个切片,而切块则是某一维取值范围下的多个切片的叠合。通过对数据立方体的切片或切块分割,可以从不同的视角得到各种数据。
钻取包括上钻和下钻。争取能够帮助用户获得更多的细节性数据,逐层的分析问题的所在和原因。
旋转又称转轴,是一种视图操作,通过旋转变换一个报告或页面显示的维度方向,在表格中重新安排维的位置,例如行列转换。这种对立方体的重定位可以得到不同视角的信息。
除以上常用多维操作外,还有其他多维操作。
OLAP的分类,如下图所示