文章目录
- 1.什么是数据仓库?
- 2.ETL是什么?
- 3.数据仓库和数据库的区别(OLTP和OLAP的区别)
- 4.数据仓库和数据集市的区别
- 5.维度分析
- 5.1 什么是维度?
- 5.2什么是指标?
- 6.什么是数仓建模?
- 7.事实表
- 7.维度表
- 8.维度建模的三种模型
- 9.缓慢渐变维(SCD)
- 10.数据仓库分层
- 10.1为什么要分层?
- 10.2数仓分层
- 10.3什么叫做维度退化?
- 11.构建数据仓库相关组件
- 11.1oozie
- 11.2sqoop
1.什么是数据仓库?
- 概念
存储数据的仓库, 主要是用于存储过去既定发生的历史数据, 对这些数据进行数据分析的操作, 从而对未来提供决策支持 - 四大特征
- 面向于主题的: 面向于分析, 分析的内容是什么 什么就是我们的主题
- 集成性: 数据是来源于各个数据源, 将各个数据源数据汇总在一起
- 非易失性(稳定性): 存储在数据仓库中数据都是过去既定发生数据, 这些数据都是相对比较稳定的数据, 不会发生改变
- 时变性: 随着的推移, 原有的分析手段以及原有数据可能都会出现变化(分析手动更换, 以及数据新增)
2.ETL是什么?
抽取 转换 加载
从数据源将数据灌入到ODS层, 以及从ODS层将数据抽取出来, 对数据进行转换处理工作, 最终将数据加载到DW层, 然后DW层对数据进行统计分析, 将统计分析后的数据灌入到DA层, 整个全过程都是属于ETL范畴
狭义上ETL: 从ODS层到DW层过程
3.数据仓库和数据库的区别(OLTP和OLAP的区别)
OLTP:联机事务处理
OLAP:联机分析处理
- 数据库(OLTP): 面向于事务(业务)的 , 主要是用于捕获数据 , 主要是存储的最近一段时间的业务数据, 交互性强,一般不允许出现数据冗余
- 数据仓库(OLAP): 面向于分析(主题)的 , 主要是用于分析数据, 主要是存储的过去历史数据 , 交互性较弱 ,可以允许出现一定的冗余
4.数据仓库和数据集市的区别
-
数据仓库其实指的集团数据中心: 主要是将公司中所有的数据全部都聚集在一起进行相关的处理操作 (ODS层),此操作一般和主题基本没有什么太大的关系
-
数据的集市(小型数据仓库): 在数据仓库基础之上, 基于主题对数据进行抽取处理分析工作, 形成最终分析的结果
一个数据仓库下, 可以有多个数据集市
5.维度分析
5.1 什么是维度?
维度一般指的分析的角度, 看待一个问题的时候, 可以多个角度来看待, 而这些角度指的就是维度
比如: 有一份2020年订单数据, 请尝试分析
可以从时间, 地域 , 商品, 来源 , 用户…
- 维度的分类:
- 定性维度: 指的计算每天 每月 各个的维度 , 一般来说定性维度的字段都是放置在group by 中
- 定量维度: 指的统计某一个具体的维度或者某一个范围下信息, 比如说: 2020年度订单额, 统计20~30岁区间人群的人数 ,一般来说这种维度的字段都是放置在where中
维度的下钻和上卷: 以某一个维度为基准, 往细化统计的过程称为下钻, 往粗粒度称为上卷
比如: 按照 天统计, 如果需要统计出 小时, 指的就是下钻, 如果需要统计 季度 月 年, 称为上卷统计
5.2什么是指标?
指标是衡量事务发展的标准,也叫度量,如价格,销量等;指标可以求和、求平均值等计算。
指标的分类:
- 绝对指标: 计算具体的值指标
count() sum() max() min() avg() - 相对指标: 计算比率问题的指标
转化率, 流失率, 同比
6.什么是数仓建模?
数仓建模指的是如何在hive中构建表, 数仓建模中主要提供两种理论来进行数仓建模操作: 三范式建模和维度建模理论
-
三范式建模: 主要是存在关系型数据库建模方案上, 主要规定了比如建表的每一个表都应该有一个主键, 数据要经历的避免冗余发生等等
-
维度建模: 主要是存在分析性数据库建模方案上, 主要一切以分析为目标, 只要是利于分析的建模, 都是OK的, 允许出现一定的冗余, 表也可以没有主键
维度建模的两个核心概念:事实表和维度表。
7.事实表
事实表: 事实表一般指的就是分析主题所对应的表,每一条数据用于描述一个具体的事实信息, 这些表一般都是一坨主键(外键)和描述事实字段的聚集
事实表的分类:
- 事务事实表:
保存的是最原子的数据,也称“原子事实表”或“交易事实表”。沟通中常说的事实表,大多指的是事务事实表。 - 周期快照事实表:
周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,时间间隔如每天、每月、每年等等
周期表由事务表加工产生 - 累计快照事实表:
完全覆盖一个事务或产品的生命周期的时间跨度,它通常具有多个日期字段,用来记录整个生命周期中的关键时间点
7.维度表
维度表: 指的在对事实表进行统计分析的时候, 基于某一个维度, 这个维度信息可能在其他表中, 而这些表就是维度表
维度表并不一定存在, 但是维度是一定存在:
比如: 根据用户维度进行统计, 如果在事实表只存储了用户id, 此时需要关联用户表, 这个时候就是维度表
比如: 根据用户维度进行统计, 如果在事实表不仅仅存储了用户id,还存储用户名称, 这个时候有用户维度, 但是不需要用户表的参与, 意味着没有这个维度表
维度表的分类:
-
高基数维度表: 指的表中的数据量是比较庞大的, 而且数据也在发生的变化
例如: 商品表, 用户表 -
低基数维度表: 指的表中的数据量不是特别多, 一般在几十条到几千条左右,而且数据相对比较稳定
例如: 日期表,配置表,区域表
8.维度建模的三种模型
- 星型模型
- 特点: 只有一个事实表, 那么也就意味着只有一个分析的主题, 在事实表的周围围绕了多个维度表, 维度表与维度表之间没有任何的依赖
- 反映数仓发展初期最容易产生模型
- 雪花模型
- 特点: 只有一个事实表, 那么也就意味着只有一个分析的主题, 在事实表的周围围绕了多个维度表, 维度表可以接着关联其他的维度表
- 反映数仓发展出现了畸形产生模型, 这种模型一旦大量出现, 对后期维护是非常繁琐, 同时如果依赖层次越多, SQL分析的难度也会加大
- 此种模型在实际生产中,建议尽量减少这种模型产生
- 星座模型
- 特点: 有多个事实表, 那么也就意味着有了多个分析的主题, 在事实表的周围围绕了多个维度表, 多个事实表在条件符合的情况下, 可以共享维度表
- 反映数仓发展中后期最容易产生模型
9.缓慢渐变维(SCD)
缓慢渐变维,即维度中的属性可能会随着时间发生改变
解决办法:
- SCD1: 直接覆盖, 不维护历史变化数据
主要适用于: 对错误数据处理 - SCD2:不删除、不修改已存在的数据, 当数据发生变更后, 会添加一条新的版本记录的数据, 在建表的时候, 会多加两个字段(起始时间, 截止时间), 通过这两个字段来标记每条数据的起止时间 , 一般称为拉链表
好处: 适用于保存多个历史版本, 方便维护实现
弊端: 会造成数据冗余情况, 导致磁盘占用率提升 - SCD3: 通过在增加列的方式来维护历史变化数据
好处: 减少数据的冗余, 适用于少量历史版本的记录以及磁盘空间不是特别充足情况
弊端: 无法记录更多的历史版本, 以及维护比较繁琐
10.数据仓库分层
10.1为什么要分层?
分层可以使数据层次清晰、依赖关系直观
数据分层却可以给我们带来如下的好处:
- 清晰数据结构:每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解。
- 复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题。
- 便于维护:当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
- 减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少重复开发的工作量。
- 高性能:数据仓库的构建将大大缩短获取信息的时间,数据仓库作为数据的集合,所有的信息都可以从数据仓库直接获取,尤其对于海量数据的关联查询和复杂查询,所以数据仓库分层有利于实现复杂的统计需求,提高数据统计的效率。
10.2数仓分层
-
ODS层: 源数据层
作用: 对接数据源, 和数据源的数据保持相同的粒度(将数据源的数据完整的拷贝到ODS层中)
注意:
如果数据来源于文本文件, 可能会需要先对这些文本文件进行预处理(spark)操作, 将其中不规则的数据, 不完整的数据, 脏乱差的数据先过滤掉, 将其转换为一份结构化的数据, 然后灌入到ODS层 -
DW层: 数据仓库层
作用: 进行数据分析的操作- DWD层: 明细层
作用: 用于对ODS层数据进行清洗转换工作 , 以及进行少量的维度退化操作
少量:
1) 将多个事实表的数据合并为一个事实表操作
2) 如果维度表放置在ODS层 一般也是在DWD层完成维度退化 - DWM层: 中间层
作用: 1) 用于进行维度退化操作 2) 用于进行提前聚合操作(周期快照事实表) - DWS层: 业务层
作用: 进行细化维度统计分析操作
- DWD层: 明细层
-
DA层: 数据应用层
作用: 存储DW层分析的结果, 用于对接后续的应用(图表, 推荐系统…)例如:
比如DWS层的数据表完成了基于订单表各项统计结果信息, 但是图表只需要其中销售额, 此时从DWS层将销售额的数据提取出来存储到DA层 -
DIM层: 维度层
作用: 存储维度表数据
10.3什么叫做维度退化?
维度退化是为了减少维度表的关联工作
做法: 将数据分析中可能在维度表中需要使用的字段, 将这些字段退化到事实表中,
这样后续在基于维度统计的时候, 就不需要在关联维度表, 事实表中已经涵盖了维度数据了例如: 订单表, 原有订单表中只有用户id, 当我们需要根据用户维度进行统计分析的时候,
此时需要关联用户表, 找到用户的名称, 那么如果我们提前将用户的名称放置到订单表中,
那么是不是就不需要关联用户表, 而则就是维度退化好处: 减少后续分析的表关联情况
弊端: 造成数据冗余
11.构建数据仓库相关组件
11.1oozie
-
什么是oozie
Oozie是一个用于管理Apache Hadoop作业的工作流调度程序系统。Oozie由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是用于Hadoop平台的开源的工作流调度引擎,是用来管理Hadoop作业,属于web应用程序,由Oozie client和Oozie Server两个组件构成,Oozie Server运行于Java Servlet容器(Tomcat)中的web程序。
-
什么是工作流?
工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。
-
能够使用工作流完成的业务一般具有什么特点呢?
- 整个业务流程需要周期性重复干
- 整个业务流程可以被划分为多个阶段
- 每一个阶段存在依赖关系,前序没有操作, 后续也无法执行
如果发现实际生产中的某些业务满足了以上特征, 就可以尝试使用工作流来解决
11.2sqoop
一个用户进行数据的导入导出的工具, 主要是将关系型的数据库(MySQL, oracle…)导入到hadoop生态圈(HDFS,HIVE,Hbase…) , 以及将hadoop生态圈数据导出到关系型数据库中