什么是 Data Warehouse?
在计算机领域,数据仓库(DW 或 DWH),是一个用于报告和数据分析的系统,被认为是商业智能的一个核心组成部分。它将当前和历史数据存储在一个地方,为整个企业的工作人员创建分析报告。(维基百科)
典型的基于提取、转换、加载(ETL)的数据仓库使用 ODS 层、DWD 层和 DWS 层来容纳其关键功能。数据分析师可以灵活的查询 (Query) 数仓中的每一层,获取有价值的商业信息。
数仓中有三个关键指标 :
- 数据的新鲜度:数据从产生开始,到在仓库中经过一系列处理后可供用户查询所经过的时间长度。通常 ETL 就是用来准备数据的一系列过程,ETL 更多是通过调度运行一系列流计算或者批计算的作业来完成。
- 数据的查询延时:数据准备好后,用户通过 Query 查询表中的数据,从用户发出查询到收到查询结果的时间长度为查询延时。查询延时直接决定了终端用户的体感。
- 成本:完成一定量的数据分析(包括 ETL 和查询等各类计算)需要的资源量。成本也是数仓中的一个关键指标。
这三个指标的关系是什么呢?
- 企业需要在控制成本的情况下,能达到更好的查询延时和新鲜度。不同的数据可能有不同的成本要求。
- 新鲜度和查询延时在某些情况也是此消彼长的关系,比如使用更长时间来准备数据、清洗和预处理数据,查询会更快。
这三个指标构成了数仓中的一个三角:
数据仓库分层
数据仓库分层主要分为以下三层:DWD、DWM、DWS。每一层功能如下:
1. 数据明细层:DWD(Data Warehouse Detail)
DWD层直接与ODS层接触,ODS层的数据经过ETL后流向该层,一般保持和ODS层一样的数据粒度。
DWD层的主要工作有以下几点:
① 数据质量保证
ODS层的异常值、缺失值等等数据问题在这一层中解决,视具体情况进行数据矫正或者补充默认值或者直接丢弃。
② 维度退化
在本层同时也要开始为后续的数据使用做准备,之前维度建模的事实表和维度表后续使用的话需要进行大量的事实表维度表关联,显然效率是非常低下的;在DWD层将一些维度退化至事实表中以减少关联,即提前关联好各维度以便后续使用。
③ 数据聚集
ODS层的数据来源各种各样,有些数据属于同一个主题的但是来源不同,因此存在于不同表之中,需要将不同来源但是属于相同主题的数据汇总到同一张表之中。
2. 数据中间层:DWM(Data Warehouse Middle)
DWM 层的作用是进行数据聚合,即计算出一些公共指标,生成一系列中间表,方便后续使用方直接取数,本层的数据聚合保留较细的维度;这一层视具体业务而定,如果业务比较简单可以不需要这一层。
3. 数据服务层:DWS(Data Warehouse Servce)
WS层即我们熟知的数据集市或者大宽表。本层将DWM层的指标数据按主题进行汇总,生成一些字段较多的大宽表,即将各个指标都放在一张表中,方便使用方直接从表里面取数不需要进行任何计算。
由于将各种指标都合并到一张表中,DWS层的表不会太多,一张表包含了较多的业务内容,多指标的整合也注定了DWS层的数据表里面的维度不会太多,仅保留各指标共有的常用的一些维度。
数据库与数据仓库的区别是什么?
数据库:传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。
数据仓库:数据仓库系统的主要应用主要是OLAP(On-Line Analytical Processing),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
以电商行业举个例子:
基本每家电商公司都会经历,从只需要 业务数据库 到 需要 数据仓库 的阶段。
- 第一阶段:创业期。开始设计一个简单的网页(前端)+ 几台服务器 + 一个MySQL,就能开门迎客了。
- 第二阶段,流量来了,客户和订单都多起来了,普通查询已经有压力了,这个时候就需要升级架构变成多台服务器和多个业务数据库(量大+分库分表),这个阶段的业务数字和指标还可以勉强从业务数据库里查询。初步进入工业化。
- 第三个阶段,一般需要 3-5 年左右的时间,随着业务指数级的增长,数据量的会陡增,公司角色也开始多了起来,开始有了 CEO、CMO、CIO,大家需要面临的问题越来越复杂,越来越深入。高管们关心的问题,从最初非常粗放的:“昨天的收入是多少”、“上个月的 PV、UV 是多少”,逐渐演化到非常精细化和具体的用户的集群分析,特定用户在某种使用场景中,例如“20~30岁女性用户在过去五年的第一季度化妆品类商品的购买行为与公司进行的促销活动方案之间的关系”。
这类非常具体,且能够对公司决策起到关键性作用的问题,基本很难从业务数据库从调取出来。原因在于:
- 业务数据库中的数据结构是为了完成交易而设计的,不是为了而查询和分析的便利设计的。
- 业务数据库大多是读写优化的,即又要读(查看商品信息),也要写(产生订单,完成支付)。因此对于大量数据的读(查询指标,一般是复杂的只读类型查询)是支持不足的。
而怎么解决这个问题,此时我们就需要建立一个数据仓库了,公司也算开始进入信息化阶段了。数据仓库的作用在于:
- 数据结构为了分析和查询的便利;
- 只读优化的数据库,即不需要它写入速度多么快,只要做大量数据的复杂查询的速度足够快就行了。
那么在这里前一种业务数据库(读写都优化)的是业务性数据库,后一种是分析型数据库,即数据仓库。