OLAP的学习与实例搭建

来源:互联网 发布:多功能计时器软件 编辑:程序博客网 时间:2024/04/28 12:53

http://blog.csdn.net/qzp1991/article/details/44016959

  • OLAP的学习与实例搭建

理论准备工作:

一.  OLAP

1.什么是OLAP

OLAP(On-LineAnalysis Processing)在线分析处理是一种共享多维信息的快速分析技术;OLAP利用多维数据库技术使用户从不同角度观察数据;OLAP用于支持复杂的分析操作,侧重于对管理人员的决策支持,可以满足分析人员快速、灵活地进行大数据复量的复杂查询的要求,并且以一种直观、易懂的形式呈现查询结果,辅助决策。

2.相关概念

(1)维

是人们观察数据的特定角度,是考虑问题时的一类属性集合构成一个维(如时间维、地理维等)。

(2)级别(Level)

人们观察数据的某个特定角度(即某个维)还可以存在细节程度不同的各个描述方面(如时间维:日期、月份、季度、年)。即维的级别。

(3)成员(Member)

维的一个取值,是数据项在某维中位置的描述。(“某年某月某日”是在时间维上位置的描述)。

(4)度量(Measure)

多维数组的取值,如“某年某月某日的工资”。

(5)钻取(Drill-up和Drill-down)

改变维的层次,变化分析的粒度。Drill-up是将低层次的数据概括到高层次的汇总数据或者说是减少维度;drill-up则是相反,是将汇总的数据深入到细节,或说是增加新维。

(6)切片和切面

是在一部分维上选定值后,关心度量数据在剩余维上的分布。如果剩余的维只有两个,则是切片;如果有三个或以上,则是切块。

(7)旋转

是变换维的方向,即在表格中重新安排维的放置(例如行列互换)

(8)星型模式

由事实表和维表组成,事实表包括所有分析维度的外键和一个度量,维表对应于各个分析的角度,它除了主键以外还包含描述和分类信息。

(9)雪花模式

有时候,维表的定义会变得复杂,例如对产品维,既要按产品种类进行划分,对某些特殊商品,又要另外进行品牌划分,商品品牌和产品种类划分方法并不一样。因此,单张维表不是理想的解决方案,可以采用以下方式,这种数据模型称为雪花模型。


二.  Mondrian的学习

2.1 Mondrian的架构

1)       底层数据库

2)      存储层 数据库部分(数据仓库)的建立 

将原有的底层数据库转化为一个星型模型或雪花模型的过程

3)      维度层 schema文件 (关键部分) 

将存储层的数据仓库转化为一个schema文件,通过schema-workbench或者手写完成,至此就可以通过MDX来对多维数据库进行访问。

4)      展示层 编写jsp文件用于展示 它位于展示层由Jpivot提供展示

JPivot 是Mondrian的表现层TagLib,

Jpivot完全基于JSP+TagLib;

JPivot另外一个可能使人不惯的地方是它完全基于taglib而不是大家熟悉的MVC模式。

但它可以很方便的将多维数据展示给最终用户。

 

下面是官网提供的Mondrian体系架构图,可以清晰的看出整个项目由底层数据库,存储层的数据仓库,维度层的schema文件和展示层组成。


Mondrian 为客户端提供一个用于查询的API

因为到目前为止,并没有一个通用的用于OLAP查询的API,因此Mondrian提供了它私有的API.

尽管如此,一个常使用JDBC的人将同样发现它很熟悉.不同之处仅在于它使用的是MDX查询语言,而非SQL

下面的java片段展示了如何连接到Mondrian,然后执行一个查询,最后打印结果

[java] view plaincopy
  1. importmondrian.olap.*;   
  2. import java.io.PrintWriter;   
  3.   
  4.    Connectionconnection = DriverManager.getConnection("Provider=mondrian;"    
  5.    +"Jdbc=jdbc:odbc:MondrianFoodMart;"+"Catalog=/WEB-INF/FoodMart.xml;",null,false);   
  6.    Query query =connection.parseQuery("SELECT {[Measures].[Unit Sales], [Measures].[StoreSales]} on columns," +" {[Product].children} on rows "  
  7.    +"FROM[Sales] " +"WHERE ([Time].[1997].[Q1], [Store].[CA].[SanFrancisco])");   
  8.   
  9.    Result result =connection.execute(query);   
  10.    result.print(newPrintWriter(System.out));  

与JDBC类似,一个Connection由DriverManager创建,Query对象类似于JDBC的Statement,它通过传递一个MDX语句来创建.Result对象类似于JDBC的ResultSet,只不过它里面保存的是多维数据。

您可以通过查看Mondrian帮助文档里的javadoc来获取更多关于Mondrian API的资料

 

2.2准备开发工具及环境

本测试需要的环境:

操作系统:Windows 7;

Web服务器:tomcat6.0;

关系数据库:mysql;

开发工具:myeclipse;

相关驱动:mysql-connector-java-3.1.12-bin.jar

 

(1)      配置jdk和tomcat环境变量

(2)      建立底层数据库

[sql] view plaincopy
  1. /*  
  2.   
  3. NavicatMySQL Data Transfer  
  4.   
  5.    
  6.   
  7. SourceServer         : localhost_3306  
  8.   
  9. SourceServer Version : 50096  
  10.   
  11. SourceHost           : localhost:3306  
  12.   
  13. SourceDatabase       : accessinfo  
  14.   
  15.    
  16.   
  17. TargetServer Type    : MYSQL  
  18.   
  19. TargetServer Version : 50096  
  20.   
  21. FileEncoding         : 65001  
  22.   
  23.    
  24.   
  25. Date:2015-03-02 11:36:40  
  26.   
  27. */  
  28.   
  29.    
  30.   
  31. SETFOREIGN_KEY_CHECKS=0;  
  32.   
  33.    
  34.   
  35. ------------------------------  
  36.   
  37. -- Tablestructure for `dim_ip`  
  38.   
  39. ------------------------------  
  40.   
  41. DROPTABLE IF EXISTS `dim_ip`;  
  42.   
  43. CREATETABLE `dim_ip` (  
  44.   
  45.   `id` smallint(6) NOT NULL auto_increment,  
  46.   
  47.   `dip` varchar(255) default NULL,  
  48.   
  49.   PRIMARY KEY (`id`)  
  50.   
  51. )ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;  
  52.   
  53.    
  54.   
  55. ------------------------------  
  56.   
  57. --Records of dim_ip  
  58.   
  59. ------------------------------  
  60.   
  61. INSERTINTO `dim_ip` VALUES ('1''61.183.248.218');  
  62.   
  63. INSERTINTO `dim_ip` VALUES ('2''61.144.207.115');  
  64.   
  65.    
  66.   
  67. ------------------------------  
  68.   
  69. -- Tablestructure for `dim_site`  
  70.   
  71. ------------------------------  
  72.   
  73. DROPTABLE IF EXISTS `dim_site`;  
  74.   
  75. CREATETABLE `dim_site` (  
  76.   
  77.   `id` smallint(6) NOT NULL auto_increment,  
  78.   
  79.   `dSiteID` int(11) default NULL,  
  80.   
  81.   PRIMARY KEY (`id`)  
  82.   
  83. )ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;  
  84.   
  85.    
  86.   
  87. ------------------------------  
  88.   
  89. --Records of dim_site  
  90.   
  91. ------------------------------  
  92.   
  93. INSERTINTO `dim_site` VALUES ('1''542');  
  94.   
  95. INSERTINTO `dim_site` VALUES ('2''548');  
  96.   
  97. INSERTINTO `dim_site` VALUES ('3''543');  
  98.   
  99. INSERTINTO `dim_site` VALUES ('4''552');  
  100.   
  101. INSERTINTO `dim_site` VALUES ('5''551');  
  102.   
  103. INSERTINTO `dim_site` VALUES ('6''549');  
  104.   
  105.    
  106.   
  107. ------------------------------  
  108.   
  109. -- Tablestructure for `dim_time`  
  110.   
  111. ------------------------------  
  112.   
  113. DROPTABLE IF EXISTS `dim_time`;  
  114.   
  115. CREATETABLE `dim_time` (  
  116.   
  117.   `id` smallint(6) NOT NULL auto_increment,  
  118.   
  119.   `signinTime` varchar(10) NOT NULL default '',  
  120.   
  121.   PRIMARY KEY (`id`)  
  122.   
  123. )ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;  
  124.   
  125.    
  126.   
  127. -- ----------------------------  
  128.   
  129. --Records of dim_time  
  130.   
  131. ------------------------------  
  132.   
  133. INSERTINTO `dim_time` VALUES ('1''2015-3-1');  
  134.   
  135. INSERTINTO `dim_time` VALUES ('2''2015-2-28');  
  136.   
  137. INSERTINTO `dim_time` VALUES ('3''2015-2-17');  
  138.   
  139. INSERTINTO `dim_time` VALUES ('4''2015-2-19');  
  140.   
  141. INSERTINTO `dim_time` VALUES ('5''2015-2-11');  
  142.   
  143.    
  144.   
  145. ------------------------------  
  146.   
  147. -- Tablestructure for `fact_logs`  
  148.   
  149. ------------------------------  
  150.   
  151. DROPTABLE IF EXISTS `fact_logs`;  
  152.   
  153. CREATETABLE `fact_logs` (  
  154.   
  155.   `fID` varchar(20) NOT NULL default '',  
  156.   
  157.   `fSiteID` varchar(20) default NULL,  
  158.   
  159.   `fTime` varchar(10) default NULL,  
  160.   
  161.   `fIP` varchar(20) default NULL,  
  162.   
  163.   `fCount` int(11) default NULL,  
  164.   
  165.   PRIMARY KEY (`fID`)  
  166.   
  167. )ENGINE=InnoDB DEFAULT CHARSET=latin1;  
  168.   
  169.    
  170.   
  171. -- ----------------------------  
  172.   
  173. --Records of fact_logs  
  174.   
  175. ------------------------------  
  176.   
  177. INSERTINTO `fact_logs` VALUES ('1''1''4''1''87');  
  178.   
  179. INSERTINTO `fact_logs` VALUES ('10''2''5''2''14');  
  180.   
  181. INSERTINTO `fact_logs` VALUES ('2''1''4''2''128');  
  182.   
  183. INSERTINTO `fact_logs` VALUES ('3''3''4''1''5');  
  184.   
  185. INSERTINTO `fact_logs` VALUES ('4''4''4''2''4');  
  186.   
  187. INSERTINTO `fact_logs` VALUES ('5''5''4''2''5');  
  188.   
  189. INSERTINTO `fact_logs` VALUES ('6''6''4''2''3');  
  190.   
  191. INSERTINTO `fact_logs` VALUES ('7''2''4''2''4');  
  192.   
  193. INSERTINTO `fact_logs` VALUES ('8''5''5''2''15');  
  194.   
  195. INSERT INTO `fact_logs` VALUES ('9','6''5''2''13');  

分析一个访问日志的事实表,有三个维度,站点、 IP 地址、日期。事实表记录的。

其中fact_logs是事实表,dim_ip,dim_site,dim_time分别代表三个维度表。

(3)      定义模式

可以使用schema-workbench生成AccessInfo.xml 将他复制到E:\apache-tomcat-7.0.40\webapps\mondrian\WEB-INF\queries

[html] view plaincopy
  1. <Schema name="Access record warehouse">  
  2.   <DimensiontypeDimensiontype="StandardDimension" visible="true" name="AccessTime">  
  3.     <HierarchyvisibleHierarchyvisible="true" hasAll="true" allMemberName="AllTime" primaryKey="id">  
  4.       <TablenameTablename="dim_time" alias="">  
  5.       </Table>  
  6.       <Level name="Sign Time"visible="true" table="dim_time"column="signinTime" internalType="String"uniqueMembers="true">  
  7.       </Level>  
  8.     </Hierarchy>  
  9.   </Dimension>  
  10.   <DimensiontypeDimensiontype="StandardDimension" visible="true" name="WebsiteNum">  
  11.     <HierarchyvisibleHierarchyvisible="true" hasAll="true" allMemberName="AllSite" primaryKey="id">  
  12.       <TablenameTablename="dim_site" alias="">  
  13.       </Table>  
  14.       <LevelnameLevelname="Sign Site" visible="true" table="dim_site"column="dSiteID" internalType="int"uniqueMembers="false">  
  15.       </Level>  
  16.     </Hierarchy>  
  17.   </Dimension>  
  18.   <DimensiontypeDimensiontype="StandardDimension" visible="true" name="UserIP">  
  19.     <HierarchyvisibleHierarchyvisible="true" hasAll="true" allMemberName="AllIP" primaryKey="id">  
  20.       <TablenameTablename="dim_ip" alias="">  
  21.       </Table>  
  22.       <LevelnameLevelname="Sign IP" visible="true" table="dim_ip"column="dip" type="String"uniqueMembers="false">  
  23.       </Level>  
  24.     </Hierarchy>  
  25.   </Dimension>  
  26.   <CubenameCubename="Access Analysis" visible="true"cache="true" enabled="true">  
  27.     <TablenameTablename="fact_logs" alias="">  
  28.     </Table>  
  29.     <DimensionUsagesourceDimensionUsagesource="Access Time" name="Access Time"visible="true" foreignKey="fTime">  
  30.    </DimensionUsage>  
  31.     <DimensionUsagesourceDimensionUsagesource="Website Num" name="WebSite Num"visible="true" foreignKey="fSiteID">  
  32.    </DimensionUsage>  
  33.     <DimensionUsagesourceDimensionUsagesource="User IP" name="User IP" visible="true"foreignKey="fIP">  
  34.    </DimensionUsage>  
  35.     <MeasurenameMeasurename="Amount" column="fCount" datatype="Integer"aggregator="sum" visible="true">  
  36.     </Measure>  
  37.   </Cube>  
  38. </Schema>  

(4)      负责展示层的编写 AccessInfo.jsp  他位于E:\apache-tomcat-7.0.40\webapps\mondrian\WEB-INF\queries

[java] view plaincopy
  1. <%@ page import="mondrian.olap.*"%>  
  2. <%@ page session="true"contentType="text/html; charset=ISO-8859-1" %>  
  3. <%@ tagliburi="http://www.tonbeller.com/jpivot" prefix="jp" %>  
  4. <%@ taglib prefix="c"uri="http://java.sun.com/jstl/core" %>  
  5.   
  6. <jp:mondrianQuery id="query01"jdbcDriver="com.mysql.jdbc.Driver"jdbcUrl="jdbc:mysql://localhost/accessInfo"catalogUri="/WEB-INF/queries/AccessInfo.xml"  
  7. jdbcUser="root"  jdbcPassword="root"  connectionPooling="false">  
  8.   
  9. select NON EMPTY {[Measures].[Amount]} ONCOLUMNS, NON EMPTY{([Access Time].[All Time], [Website Num].[All Site]) } ONROWS from [Access Analysis]   
  10. where [User IP].[All IP].[61.144.207.115]  
  11.   
  12. </jp:mondrianQuery>  



其中度量Mesures是具体的日志访问量(Amount),维度是Access Time,WebSite Num和User IP,展开和关闭All Time和All Site对应OLAP中的上钻和下钻操作,MDX中的where [UserIP].[61.144.207.115] 代表着一个切面,可以通过修改[User IP]下的值来获取不同切面下的time和site对应的日志访问量的值。

0 0
原创粉丝点击