以前介绍了几个基本工具:saiku 和 Schema Workbench,算是入门级别的了解多维报表,如果要继续深入,需要深入了解如下几个概念:
1、OLAP
联机分析处理,和他对应的是OLTP(联机事务处理)。
OLTP:做为一个开发人员,OLTP是最常用的,甚至都不需要理解这个概念!比如各种门票销售系统、付款系统等等。这些系统对相应速度要求特别高
OLAP:主要用于分析和决策,是数据仓库的主要应用。比如:渠道A在2015-10-01给产品B带来多少pv、uv、订单、销售额等数据,这就对分析的能力提出了很高的要求。开发人员开到这里可能会想,这是一个Sql能解决的,有必要搞出一个概念吗?我理解是有两个原因,首先需求非常非常多,不可能每一个都写Sql,会累死的;其次从业务数据表里面写这个Sql,往往非常复杂,如果数据量很大,运行时间也会很长。
下面是OLAP和OLTP的主要区别:
|
OLTP |
OLAP |
用户 |
操作人员,低层管理人员 |
决策人员,高级管理人员 |
功能 |
日常操作处理 |
分析决策 |
DB设计 |
面向应用 |
面向主题 |
数据 |
当前的,最新的细节的,二维的分立的 |
历吏的,聚集的,多维的,集成的,统一的 |
存取 |
读/写数十条记录 |
读上百万条记录 |
工作单位 |
简单的事务 |
复杂的查询 |
DB大小 |
100MB-GB |
100GB-TB |
2、Mondrian
Mondrian是OLAP的分析引擎,他可以执行MDX语句,可以分析数据模式的XML。
为什么需要OLAP引擎Mondrian?在工作中经常需要对数据量极大的数据表和相关联的多个维度表进行查询、汇总、轴变换以及上卷、下钻等操作,查询可以非常复杂,如果没有 OLAP 引擎这是很难完成的。 想象一下,某个省份的uv是多少?某个省份某天的uv是多少?某个渠道给某个省份某天的uv是多少?某个渠道给某个省份某个城市某天的uv是多少?......要多少Sql
3、数据库表
其实这不算是新的概念,这里主要是说明一下数据库表和Mondian之间的关系。Mondrian使用JDBC链接数据库,并运行在数据库基础上。数据表分为:事实表和维度表,这些概念可以参考:http://www.cnblogs.com/liqiu/p/4243437.html
4、立方体
这是核心概念,事实表和维度表共同构成了立方体。如图所示:
这个立方体有三个维度时间(Time)、货运方式(Route)、地区(Source),数据(度量) 就位于各轴的交叉点(Cell)。
如果关心不同的维度和层次,就会得到不同的数据粒度,在立方体中就是一个面,或者一个柱形,或一个小立方体。这也叫数据立方体的一个切片(Slicer)。
关心维度越少,层次越高,数据量就越少,这是一个聚集(Aggregate)的过程,会对度量进行聚集操作(一般是汇总)。
5、维度
维度(Dimension)表示数据的属性,一个维度一般会有一个维表(也可能多个),事实表会有一个字段关联维表。
比如某个销售数据里可能会有客户这个维度,有一个 customers 表:包含客户名字、性别、地区等属性,在事实表会有一个字段叫 customer_id,关联 customers 表。
有的维度可以没有维度表,因为这种维度比较简单,没有更多属性,没有必要加一个维度表。这种维度叫退化维度。比如事实表里有一个支付方式字段,只有已确定的有限几种取值:比如 cash(现金)、credit(信用卡)等。又比如事实表里已有了一个性别字段,那性别这个维度就不需要一个维表。
5.1 维度的层次
维度是可以有层次的。比如前面的数据立方体,三个维度都有层次。货运方式分陆地和非陆地,陆地分公路和铁路、非陆地分海路和航空。分层次的维度提供了更多的数据粒度选择。
维度的层次(Hierarchy)包含多层/级(Level),在维表中一般每层会有一个字段,事实表关联的是最低一级维度。比如 Time 维度表,如下:
CREATE TABLE "Time" ( stattime date, -- 日期 week integer, -- 周 month integer, -- 月 quarter integer, -- 季度 year integer -- 年 )
事实表关联的是维表的日期(yyyy-MM-dd)字段,而维表还有月、季度、年字段。有些事实表会增加月、季度、年(冗余)字段,为了 在查询时减少关联维表。
5.2 维度的成员
维度的成员(Member)指的维表某个级别(Level)的一个取值。以时间维度为例,假设时间维度分为年份、季度、月份、日期这样的级别,时间跨度是 2003 年至 2005 年(假设每一天都要数据),那么日期这一级别(最低的级别)的成员(Members)是维度表所有的日期(2003-1-1,2003-1-2...2005-12-31)(1 千多个成员),月份这一级别的成员是 1-12(12 个),季度的成员是 1-4(4 个),年份的成员是2003-2005(3 个)
6、聚集表
聚集表:是为了提升效率事先对事实表进行轻度的汇总。相当于预处理,不用每次都计算
7、Schema
多维数据的事实表、维表、聚集表等存储于数据库中,属于物理模型;而数据立方体、维度、度量这些概念属于逻辑模型。多维分析引擎必须要理解逻辑模型,并能够映射到物理模型上。多维数据的模式(Schema)就是用来描述这个逻辑模型以及到物理模型的映射的。 模式(Schema)是多维数据库的元数据。
比如咱们在使用saiku的时候,上传的shema文件。或者使用mondrian workpench的时候,自动生成的xml文件都是这个内容,下面是一个例子:
<Schema name="qiu-schema"> <Cube name="qiu-cube" visible="true" cache="true" enabled="true"> <Table name="sale" schema="public" alias=""> </Table> <Dimension type="StandardDimension" visible="true" foreignKey="cusid" name="qiuDimension"> <Hierarchy name="qiuHierarchy" visible="true" hasAll="true" allMemberName="allCustomer" allMemberCaption="所有名称"> <Table name="customer" schema="public" alias=""> </Table> <Level name="qiuLevel" visible="true" column="gender" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never"> </Level> </Hierarchy> </Dimension> <Measure name="qiuMeasure" column="num" datatype="Numeric" aggregator="sum" visible="true"> </Measure> </Cube> </Schema>
参考:
http://76287.blog.51cto.com/66287/885475
http://www.cnblogs.com/liqiu/p/4243437.html