数据仓库
- 数据仓库的概念
- 数据仓库的主要特征
- 数据仓库的分层
-
- 数据仓库的分层介绍
-
- [原始数据层:ODS(Operational Data Store)](#原始数据层:ODS(Operational Data Store))
- [数据仓库层:DW(Data Warehouse)](#数据仓库层:DW(Data Warehouse))
- [数据明细层:DWD(Data Warehouse Details)](#数据明细层:DWD(Data Warehouse Details))
- [数据中间层:DWM(Data Warehouse Middle)](#数据中间层:DWM(Data Warehouse Middle))
- [数据汇总层:DWS(Data Warehouse Service)](#数据汇总层:DWS(Data Warehouse Service))
- [数据应用层:ADS(Application Data Service)](#数据应用层:ADS(Application Data Service))
- 维表层:DIM(Dimension)
- ETL
- [ETL 和 ELT](#ETL 和 ELT)
- 数据仓库中数据的来源
- 数据仓库多维数据模型的基本概念
- OLTP与OLAP
- 数据集市
- 数据库与数据仓库
数据仓库的概念
数据仓库(Data Warehouse)是来自一个或多个不同源的集成数据的中央存储库,通过对数据仓库中的数据分析,可以帮助企业,改进业务流程,控制成本,提高产品质量等。数据仓库的两个主要功能:存储分析数据和处理分析数据。
数据仓库的主要特征
(1)面向主题性
数据库的特点是面向应用进行数据的组织,各个业务系统可能是相互分离的。不同于传统数据库对应于某一个或多个项目,数据仓库根据使用者实际需求,将不同数据源的数据在一个较高的抽象层次上做整合,所有数据都围绕某一主题来组织。
(2)集成性
数据仓库中存储的数据是来源于多个数据源的集成,原始数据来自不同的数据源,存储方式各不相同。要整合成为最终的数据集合,需要从数据源经过一系列抽取、清洗、转换的过程。
(3)非易失性
数据仓库中保存的数据是一系列历史快照,不允许被修改。用户只能通过分析工具进行查询和分析。我们是通过数仓去分析数据中的规律,而不是去创造修改其中的规律。因此数据进入数据仓库后,它便稳定且不会改变。
(4)时变性
数据仓库包含各种粒度的历史数据,数据可能与某个特定日期、星期、月份、季度或者年份有关。虽然数据仓库的用户不能修改数据,但并不是说数据仓库的数据是永远不变的。分析的结果只能反映过去的情况,当业务变化后,挖掘出的模式会失去时效性。因此数据仓库的数据需要随着时间更新,以适应决策的需要。从这个角度讲,数据仓库建设是一个项目,更是一个过程。
数据仓库的数据随时间的变化表现在以下几个方面。
数据仓库的数据时限一般要远远长于操作型数据的数据时限。
操作型系统存储的是当前数据,而数据仓库中的数据是历史数据。
数据仓库中的数据是按照时间顺序追加的,它们都带有时间属性。
数据仓库的分层
如图所示,这是目前一种通用的数据分层设计。企业在实际运用中可以基于这个基础分层之上添加新的层次,来满足不同的业务需求。
我们将数据模型分为三层:数据运营层(ODS)、数据仓库层(DW)和数据应用层(APP)(或数据产品层ADS)
ODS层存放的是接入的原始数据,DW层是存放我们要重点设计的数据仓库中间层数据,APP/ADS是面向业务定制的应用数据。
这里再讲下数据分层的好处:
① 数据结构化更清晰:对于不同层级的数据,他们作用域不相同,每一个数据分层都有它的作用域,这样我们在使用表的时候能更方便地定位和理解。
② 数据血缘追踪:提供给外界使用的是一张业务表,但是这张业务表可能来源很多张表。如果有一张来源表出问题了,我们可以快速准确的定位到问题,并清楚每张表的作用范围。
③ 减少重复开发:数据分层规范化,开发一些通用的中间层数据,能够减少重复计算,提高单张业务表的使用率。
④ 简化复杂的问题:把一个复杂的业务分成多个步骤实现,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
⑤ 减少业务的影响:业务可能会经常变化,这样做就不必改一次业务就需要重新接入数据。
数据仓库的分层介绍
原始数据层:ODS(Operational Data Store)
是最接近数据源中数据的一层,此层存放未经过处理的原始数据至数据仓库系统,结构上与源系统保持一致,是数据仓库的数据准备区。主要完成基础数据引入到数仓的职责,和数据源系统进行解耦合,同时记录基础数据的历史变化。
处理原则:
根据源业务系统表的情况以增量或全量方式抽取数据;
ODS层以流水表和快照表为主,按日期对数据进行分区保存,不使用拉链表;
ODS层的数据不做清洗和转换,数据的表结构和数据粒度与原业务系统保持一致。
数据仓库层:DW(Data Warehouse)
数据仓库层从上到下,又可以分为3个层:数据细节层DWD、数据中间层DWM、数据服务层DWS。
主要完成数据加工与整合,建立一致性的维度,构建可复用的面向分析和统计的明细事实表,以及汇总公共粒度的指标。
数据明细层:DWD(Data Warehouse Details)
DWD层的数据是经由ODS层数据经过清洗、转换后的明细数据,满足对标准化数据需求。如对NULL值处理,对数据字典解析,对日期格式转换,字段合并、脏数据处理等。
处理原则:
数据结构与ODS层一致,但可以对表结构进行裁剪和汇总等操作;
对数据做清洗、转换;
DWD层的数据不一定要永久保存,具体保存周期视业务情况而定。
数据中间层:DWM(Data Warehouse Middle)
该层是在DWD层的数据基础上,对数据做一些轻微的聚合操作,生成一些列的中间结果表,提升公共指标的复用性,减少重复加工的工作。
简答来说,对通用的核心维度进行聚合操作,算出相应的统计指标
数据汇总层:DWS(Data Warehouse Service)
DWS层数据 按主题对数据进行抽象、归类,提供业务系统细节数据的长期沉淀。这一层是一些汇总后的宽表,是根据DWD层数据按照各种维度或多种维度组合,把需要查询的一些事实字段进行汇总统计。可以满足一些特定查询、数据挖掘应用,面向业务层面,根据需求进行汇总。
处理原则:
面向全局、数据整合;
存放最全的历史数据,业务发生变化时易于扩展,适应复杂的实际业务情况;
尽量减少数据访问时的计算量,优化表的关联。维度建模,星形模型;
事实拉宽,度量预先计算, 基本都是快照表。反规范化,有数据冗余。
数据应用层:ADS(Application Data Service)
该层主要是提供给数据产品和数据分析使用的数据,一般会存放在ES、Redis、PostgreSql等系统中供线上系统使用;也可能存放在hive或者Druid中,供数据分析和数据挖掘使用,比如常用的数据报表就是存在这里的。
面向最终用户,面向业务定制提供给产品和数据分析使用的数据。包括前端报表、分析图表、KPI、仪表盘、OLAP专题、数据挖掘等分析。
维表层:DIM(Dimension)
维度表(Dimension Table)或维表,有时也称查找表(Lookup Table),是与事实表相对应的一种表;它保存了维度的属性值,可以跟事实表做关联,相当于将事实表上经常重复出现的属性抽取、规范出来用一张表进行管理。维度表主要是包含两个部分:
高基数维度数据:一般是用户资料表、商品资料表类似的资料表,数据量可能是千万级或者上亿级别
低基数维度数据:一般是配置表,比如枚举字段对应的中文含义,或者日期维表等;数据量可能就是个位数或者几千几万。
常见的维度表有:日期表(存储与日期对应的周、月、季度等的属性)、地点表(包含国家、省/州、城市等属性)等。
ETL
建立OLAP应用之前,我们要想办法把各个独立系统的数据抽取出来,经过一定的转换和过滤,存放到一个集中的地方,成为数据仓库。这个抽取,转换,加载的过程叫ETL(Extract, Transform,Load),目的是将企业中分散、零乱、标准不统一的数据整合到一起。
ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。
抽取
抽取的数据源分为结构化数据、非结构化数据,半结构化数据。
结构化一般采用JDBC、数据库日志方式,非结构或半结构化数据会建通文件变动。
抽取方式:
全量抽取:适用于数据量小且不容易判断其数据发生改变的诸如关系表,维度表,配置表等,一般用于初始化数据。
增量抽取:适用于数据量大,为了节省抽取时间而采用的抽取策略,一般用于数据更新。
清洗
空值处理:将空值替换为特定值或直接过滤掉
验证数据正确性:把不符合业务含义的数据做统一处理
规范数据格式:比如把所有日期都规范成YYYY-MM-DD的格式
数据转码:把一个源数据中用编码表示的字段通过关联编码表转换成代表其真实意义的值
数据标准统一:比如在源数据中表示男女的方式有很多种,在抽取的时候直接根据模型中定义的值做转化。
注:主要是针对非结构化或半结构化数据
转换和加载
转换:用ODS中的增量或者全量数据来刷新DW中的表
加载:每insert数据到一张表都可以称为数据加载,就是将处理完的数据导入到对应的目标源里
ETL 和 ELT
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程。但是在实际操作中将数据加载到仓库却产生了两种不同做法:ETL和ELT。
首先从数据源池中提取数据,这些数据源通常是事务性数据库。数据保存在临时暂存数据库中。然后执行转换操作,将数据结构化并转换为适合目标数据仓库系统的形式。然后将结构化数据加载到仓库中,以备分析。
使用ELT,数据在从源数据池中提取后立即加载。没有临时数据库,这意味着数据会立即加载到单一的集中存储库中。数据在数据仓库系统中进行转换,以便与商业智能工具和分析一起使用。大数据时代的数仓这个特点很明显。
数据仓库中数据的来源
数据仓库中的数据来源归纳起来大体有3种:
- 结构化数据:一般来自于数据库,比如MySQL等关系型数据库的表中保存的记录(rows)。即承担OLTP功能的数据载体。这类数据最好处理,因为数据表达方式作为规范,约束性最好。
- 半结构化数据:该部分数据来源较多,包括用户行为日志(如app的页面访问记录)、平台或管理服务日志(tomcat、mysql等服务日志)等等,也包括存储于MongoDB等NoSQL数据库中的记录(Docs等)。这些数据一般以Json或XML等形式存在,在ETL时难度较大。
- 非结构化数据:包括图片、音频、视频和网页等,这些数据非常复杂,信息量也很大,一般不会直接抽取出来直接保存到数仓中,而是记录他们的元数据信息(metadata),举图片为例,可能保存该图片的产生时间、格式、大小等等,至于图片本身,一般通过url链接保存在对象或文件存储系统中。
数据仓库多维数据模型的基本概念
主题(Subject)
主题就是指我们所要分析的具体方面。例如:某年某月某地区某机型某款App的安装情况。主题有两个元素:一是各个分析角度(维度),如时间位置;二是要分析的具体量度,该量度一般通过数值体现,如App安装量。
维(Dimension)
维是用于从不同角度描述事物特征的,一般维都会有多层(Level:级别),每个Level都会包含一些共有的或特有的属性(Attribute)。
以时间维为例,时间维一般会包含年、季、月、日这几个Level,每个Level一般都会有ID、NAME、DESCRIPTION这几个公共属性,这几个公共属性不仅适用于时间维,也同样表现在其它各种不同类型的维。
分层(Hierarchy)
OLAP需要基于有层级的自上而下的钻取,或者自下而上地聚合。所以我们一般会在维的基础上再次进行分层,维、分层、层级的关系。
量度
量度就是我们要分析的具体的技术指标,诸如年销售额之类。它们一般为数值型数据。我们或者将该数据汇总,或者将该数据取次数、独立次数或取最大最小值等,这样的数据称为量度。
粒度
数据的细分层度,例如按天分按小时分。
事实表和维表
事实表是用来记录分析的内容的全量信息的,包含了每个事件的具体要素,以及具体发生的事情。事实表中存储数字型ID以及度量信息。
维表则是对事实表中事件的要素的描述信息,就是你观察该事务的角度,是从哪个角度去观察这个内容的。
事实表和维表通过ID相关联,如图所示:
企业级数据仓库/数据集市
企业级数据仓库:突出大而全,不论是细致数据和聚合数据它全都有,设计时使用事实星座模式。
数据集市:可以看做是企业级数据仓库的一个子集,它是针对某一方面的数据设计的数据仓库,例如为公司的支付业务设计一个单独的数据集市。由于数据集市没有进行企业级的设计和规划,所以长期来看,它本身的集成将会极其复杂。其数据来源有两种,一种是直接从原生数据源得到,另一种是从企业数据仓库得到。
OLTP与OLAP
联机事务处理(OLTP):主要是执行基本日常的事务处理,比如数据库记录的增删查改。传统的关系型数据库系统作为数据管理的主要手段,主要用于操作型处理。OLTP系统的典型应用就是RDBMS,也就是我们俗称的数据库,当然这里要特别强调此数据库表示的是关系型数据库,
用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。
联机分析处理(OLAP)
主要目标是做数据分析。数据仓库是OLAP系统的一个典型示例,主要用于数据分析。
附上OLTP、OLAP两者区别
数据集市
数据仓库是面向整个集团组织的数据,数据集市是面向单个部门使用的。可以认为数据集市是数据仓库的子集。
比如上图所示:
各种操作型系统数据和包括文件在内的等其他数据作为数据源,经过ETL(抽取转换加载)填充到数据仓库中;
数据仓库中有不同主题数据,数据集市则根据部门特点面向指定主题,比如Purchasing(采购)、Sales(销售)、Inventory(库存);
用户可以基于主题数据开展各种应用:数据分析、数据报表、数据挖掘。
数据库与数据仓库
数据库是面向事务的设计,数据仓库是面向主题设计的。
数据库一般存储业务数据,数据仓库存储的一般是历史数据。
数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
企业中一般先有数据库,然后有数据仓库,可以没有数据仓库,但是不能没有数据库。
数据仓库不是大型的数据库,只是一个数据分析的平台。
参考:
https://blog.csdn.net/hello_java_lcl/article/details/107025192
https://blog.csdn.net/Remix_xy/article/details/125710888
https://www.likecs.com/show-203569599.html
http://www.uml.org.cn/sjjmck/202212064.asp
https://baijiahao.baidu.com/s?id=1725536452637878811\&wfr=spider\&for=pc