数据仓库
数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。其实数据仓库本身并不“生产”任何数据,同时自身也不需要“消费”任何的数据,数据来源于外部,并且开放给外部应用。因此数据仓库的基本架构主要包含的是数据流入流出的过程,可以分为三层——源数据、数据仓库、数据应用:
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程,ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。
多维数据模型
多维数据模型是为了满足用户从多角度多层次进行数据查询和分析的需要而建立起来的基于事实和维的数据库模型,其基本的应用是为了实现OLAP(Online Analytical Processing)。
事实表和维表
事实表是用来记录具体事件的,包含了每个事件的具体要素,以及具体发生的事情;维表则是对事实表中事件的要素的描述信息。比如一个事件会包含时间、地点、人物、事件,事实表记录了整个事件的信息,但对时间、地点和人物等要素只记录了一些关键标记,比如事件的主角叫“Michael”,那么Michael到底“长什么样”,就需要到相应的维表里面去查询“Michael”的具体描述信息了。基于事实表和维表就可以构建出多种多维模型,包括星形模型、雪花模型和星座模型。
这是一个最简单的星形模型的实例。事实表里面主要包含两方面的信息:维和度量,维的具体描述信息记录在维表,事实表中的维属性只是一个关联到维表的键,并不记录具体信息;度量一般都会记录事件的相应数值,比如这里的产品的销售数量、销售额等。维表中的信息一般是可以分层的,比如时间维的年月日、地域维的省市县等,这类分层的信息就是为了满足事实表中的度量可以在不同的粒度上完成聚合,比如2010年商品的销售额,来自上海市的销售额等。
数据立方体和OLAP
数据立方体(Data Cube),只是多维模型的一个形象的说法。立方体其本身只有三维,但多维模型不仅限于三维模型,可以组合更多的维度。
OLAP(On-line Analytical Processing,联机分析处理)是在基于数据仓库多维模型的基础上实现的面向分析的各类操作的集合。其与传统的OLTP(On-line Transaction Processing,联机事务处理)的区别如下:
OLAP的基本操作
OLAP的操作是以查询——也就是数据库的SELECT操作为主,但是查询可以很复杂,比如基于关系数据库的查询可以多表关联,可以使用COUNT、SUM、AVG等聚合函数。OLAP正是基于多维模型定义了一些常见的面向分析的操作类型是这些操作显得更加直观。
OLAP的多维分析操作包括:钻取(Drill-down)、上卷(Roll-up)、切片(Slice)、切块(Dice)以及旋转(Pivot)。
- 钻取(Drill-down):在维的不同层次间的变化,从上层降到下一层,或者说是将汇总数据拆分到更细节的数据,比如通过对2010年第二季度的总销售数据进行钻取来查看2010年第二季度4、5、6每个月的消费数据,如上图;当然也可以钻取浙江省来查看杭州市、宁波市、温州市……这些城市的销售数据。
- 上卷(Roll-up):钻取的逆操作,即从细粒度数据向高层的聚合,如将江苏省、上海市和浙江省的销售数据进行汇总来查看江浙沪地区的销售数据,如上图。
- 切片(Slice):选择维中特定的值进行分析,比如只选择电子产品的销售数据,或者2010年第二季度的数据。
- 切块(Dice):选择维中特定区间的数据或者某批特定值进行分析,比如选择2010年第一季度到2010年第二季度的销售数据,或者是电子产品和日用品的销售数据。
- 旋转(Pivot):即维的位置的互换,就像是二维表的行列转换,如图中通过旋转实现产品维和地域维的互换。
维和立方
维(Dimension)
维是用于从不同角度描述事物特征的,一般维都会有多层(Level),每个Level都会包含一些共有的或特有的属性(Attribute),可以用下图来展示下维的结构和组成:
以时间维为例,时间维一般会包含年、季、月、日这几个Level,每个Level一般都会有ID、NAME、DESCRIPTION这几个公共属性,这几个公共属性不仅适用于时间维,也同样表现在其它各种不同类型的维。
Hierarchy
上面这个结构的维是无法直接应用于OLAP的,OLAP需要基于有层级的自上而下的钻取,或者自下而上地聚合。所以每一个维必须有Hierarchy,至少有一个默认的,当然可以有多个,见下图:
有了Hierarchy,维里面的Level就有了自上而下的树形结构关系,也就是上层的每一个成员(Member)都会包含下层的0个或多个成员,也就是树的分支节点。这里需要注意的是每个Hierarchy树的根节点一般都设置成所有成员的汇总(Total),当该维未被OLAP中使用时,默认显示的就是该维上的汇总节点,也就是该维所有数据的聚合(或者说该维未被用于细分)。Hierarchy中的每一层都会包含若干个成员(Member),还是以时间维,假设我们建的是2006-2015这样一个时间跨度的时间维,那么最高层节点仅有一个Total的成员,包含了所有这10年的时间,而年的那层Level中包含2006、2007…2015这10个成员,每一年又包含了4个季度成员,每个季度包含3个月份成员……
每个Hierarchy都包含了一个树形结构,但维中也可以包含多个Hierarchy,正如上图所示,维中的Hierarchy相互独立地构建了自己的树形结构。还是以时间维为例,时间维可以根据日历(Calendar)时间组建日历的Hierarchy,也可以根据财务(Fiscal)时间组建财务的Hierarchy,而其中财务季度的划分可能并不与日历一致,基于这种多样的Hierarchy,我们在组建多维模型时可以按需选择合适的,比如给财务部的数据分析模型选用财务Hierarchy,而其他部门的分析人员显然希望看到日历样式的Hierarchy,这样就完美地满足了不同的需求。
立方(Cube)
这里所说的立方其实就是多维模型中间的事实表(Fact Table),它会引用所有相关维的维主键作为自身的联合主键,加上度量(Measure)和计算度量(Calculated Measure)就组成了立方的结构:
度量是用于描述事件的数字尺度,比如网站的浏览量(Pageviews)、访问量(Visits),再如电子商务的订单量、销售额等。度量是实际储存于物理表中的,而计算度量则没有,计算度量是通过度量计算得到的,比如同比(如去年同期的月利润)、环比(如上个月的利润)、利率(如环比利润增长率)、份额(如该月中某类产品利润所占比例)、累计(如从年初到当前的累加利润)、移动平均(如最近7天的平均利润额)等,这些计算度量在Oracle中都可以借助分析函数直接计算得到,相信大部分的OLAP组件都会提供类似在时间序列上的分析功能。而这些计算度量往往对于分析而言更具意义,立方中借助与各个维的关联关系从不同的角度和层面来展现这些度量。
数据立方体实例
数据立方体是数据仓库和OLAP的基本工具。从概念上讲,数据立方体是一个多层次、多维的数据库,具有各种不同的粒度聚合。它是group-by操作符的泛化,包含与维列表的所有可能组合对应的group-bys。
例子:在一个marketing management data warehouse中,以模式 sales(Store, Product, Season, Sale) 进行数据收集。基本事实表如下图,属性Store, Product,Season被称为维度,Sale被称为度量。
数据立方体是由{Store, Product, Season}的每个子集组成的groupBy分组(共有8个groupBy),使用诸如AVG(Sale)这样的聚合函数,进行分组聚合返回的结果集。每个group by对应于一组单元格。如下图所示,维度中的符号“*”表示将该维度一般化,以便匹配其域中的任何值。数据立方体如下图:
数据立方体物化
分组的属性的组合叫方体(cuboid),数据单元(cell)就是方体中的一个元组,分组的属性有 i 个的方 体称为 i 维方体。例如创建一个数据仓库 sales 用来记录商店的销售,包括四个维 分别是 Product(产品)、Time(时间)、Location(城市)、Sales(销量),将 不同属性聚集数据可以形成 0 维方体,1 维方体,2 维方体,3 维方体,4 维方体 方体形成的数据立方体的格如图所示。
数据立方体是由原始数据事实表中记录的所有方体构成的。通过原始数据来构建数据仓库时,直接获得的只有包含数据立方体中的基本方体(上述四维方体),而想要获得所有方体,必须通过相关操作聚集物化。对于一个 n 维数据立方体来说,包含的方体的总数为:
其中 Li 为第 i 个维度的维度层次(level)数。
所以对于一个多维度、多层次的数据立方体,其方体的数量多,计算全部的方体是耗时耗空间的工作。因此对于不同体量的数据立方体应 该采取不同的物化策略,对于数据立方体的物化方法,大致包括:全物化、部分 物化、不物化这三种。
- 全物化是指计算并存储当前数据可以聚集物化获得的所有方体的结果,覆盖整个数据立方体。当维度、维度层次数量较多时,全物化需要花费大量的时间和 空间来计算和存储这些方体。全物化带来的好处主要是可以显著提高查询的效率。 由于所有的方体都已经被计算和存储,因而查询时可以直接获得结果。
- 部分物化是指针对数据立方体可以获得的方体,进行有选择性地计算并部分 存储,这种方法需要花费旳时间少于全物化,具体的时间与选择物化的方式有关。 对于查询而言,如果查询的数据是已经物化的,则查询效率高、若查询的数据没 有被物化,则查询效率与不物化相同。
- 不物化是指仅保留数据立方体中的基本方体,即最详细的记录,不计算任何其他聚集后的方体。这种方法虽然省时省空间,但是在查询时,只要查询记录不是基本方体,都需要进行相关的计算才能获得查询结果,查询效率最差。
上一节中的数据立方体实例即为全物化。
针对于数据立方体存储的研究,很多学者提出了不同的压缩模型,例如冰山立方体、封闭立方体、商立方体等等。封闭立方体在物化过程中,只保存了所有等价类的上界。因此在封闭立方体中,只包含封 闭单元。传统的封闭立方体虽然可以有效地对原始立方体进行压缩,但是它存在一个缺点:无法对非单调聚集函数进行支持。冰山立方体和封闭立方体都实现了数据立方体的压缩,但是没有考虑方体之间的语义关系。然而在大部分的数据查询 中 , 都 需 要 通 过 方 体 间 的 语 义 来 获 得 结 果 。 在 这 个 前 提 下 Laks V.S.Lakshmanan等首次提出了商立方体的数据压缩模型。
参考博客:
http://webdataanalysis.net/web-data-warehouse/data-cube-and-olap/
http://webdataanalysis.net/web-data-warehouse/data-warehouse-frame/
http://webdataanalysis.net/web-data-warehouse/multidimensional-data-model/
参考文献:
《分布式环境下多维空间联机分析缓存模型研究》