OLAP(联机分析处理 On-Line Analytical Processing)

本贴最后更新于 2987 天前,其中的信息可能已经渤澥桑田

由于公司需要自行开发一套 OLAP 联机事务处理,先了解下 OLAP,一边学习下 OLAP,一边看下 spark。嘎嘎

本文转载于:http://www.mamicode.com/info-detail-1211469.html

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="&#25152;&#26377;&#21517;&#31216;">
                <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>
 
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3454 回帖 • 189 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...