数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。一般情况下,数据分析系统才会用到数仓建模,一般得业务系统为关系建模
一、总概流程
电子商城数据仓库的数据来源有两种:用户的行为日志和系统的业务数据库
-
得到数据之后,将数据导入到HDFS系统,之后导入到hive中进行后续的分析操作(通过日期进行分别管理)
-
基于Hive系统,进行数据仓库各层的建立,各层之间的建模相互依赖
-
数仓建模完毕,可以依据其为机器学习、数据挖掘等下层的数据应用提供基础数据,最终完成数据分析、决策分析的目的
二、数据分层
为什么要进行分层?
- 可以把复杂的问题简单化。将复杂的任务分解成多层来完成,每一层只处理简单的任务,方便定位问题
- 减少重复开发。规范数据分层,通过的中间层数据,能够减少极大的重复计算,增加一次计算结果的复用性
- 隔离原始数据。不论是数据的异常还是数据的敏感性,通过分层可以使真实数据与统计数据解耦开
数据市集和数据仓库的区别?
数据市集:微型的数据仓库,有更少的数据,更少的主题区域,以及更少的历史数据,是部门级的,一般只能为某个局部范围内的管理人员服务
数据仓库:企业级的,能够为整个企业各个部门的运行提供决策支持手段
数据仓库是数据市集的和
分为哪些层?
层的名称是不固定的,层数也是不固定的,可以根据具体的业务以及需求进行相应的调整,一般情况下分为以下几层:
- ODS(Operation Data Store)原始数据层
原始数据层,存放原始数据,直接加载原始日志、数据,数据保持原貌不做处理
- DWD(data warehouse detail)明细数据层
对ODS层数据进行清洗(去除空值,脏数据,超过极限范围的数据)、维度退化(维度建模的时候进行)、脱敏等
根据ODS数据进行维度建模,得到DWD层
- DWS(data warehouse service)服务数据层
根据之前的数据层,按天进行轻度的汇总
- DWT(data warehouse Topic)数据主题层
按照之前的数据,按照关心得主题进行汇总
- ADS(Appilcation Data Store)数据应用层
根据实际得应用需求为各种统计报表提供数据
三、数仓理论
分类
星型模型
标准的星型模型维度只有一层
雪花模型
比较靠近3NF,有多层维度
星座模型
多个星型模型组成了星座模型,多个模型之间存在共用维表的现象
那在实际的建模中应该怎么选择呢?
-
应该按照性能优先、灵活度优先的原则进行选择
-
一般情况下倾向于选择维度少的星型模型,没有过度的追求数据表的简洁性,在Hadoop体系中,减少Join就是减少了shuffle,虽然星型模型有很多的冗余数据,但是性能好
维度表
定义:
一般是对事实的描述信息。每一张维表对应现实世界中的一个对象或者概念。 例如:用户、商品、日期、地区等。
特征:
- 维表的范围很宽(具有多个属性、列比较多),将能想到的相关的属性都放到一个维表
- 跟事实表相比,行数相对较小:通常< 10万条
- 内容相对固定:相当于编码表
常见的维表:
时间维表
地点维表等等
分类:
-
全量表。一次性全部导入,之后不再发生改变
-
拉链表
定义:
拉链表,记录每条信息的生命周期,一旦一条记录的生命周期结束,就重新开始一条新的记录,并把当前日期放入生效开始日期。如果当前信息至今有效,在生效结束日期中填入一个极大值(如9999-99-99 )。
为什么要使用拉链表? 拉链表适合于数据量大,数据会发生变化,但是大部分是不变的。(即:缓慢变化维,只更新每日新增及变化)
如果使用拉链表? 通过,生效开始日期<=某个日期 且 生效结束日期>=某个日期,能够得到某个时间点的数据全里切片。
如何制作拉链表? 用户当日全部数据和MySQL中每天变化的数据拼接在一起,形成一个新的临时拉链表数据。用临时的拉链表覆盖旧的拉链表数据。(这就解决了hive表中数据不能更新的问题)
事实表
定义:
每行数据代表一个业务事件(下单、支付、退款、评价等)
包含成分:
- 具有可加性的数值型的度量值
- 与维表相连接的外键
- 通常具有两个和两个以上的外键
- 外键之间表示维表之间多对多的关系
特征:
-
数据量非常的大,行数比较多
-
内容相对的窄:列数较少,列主要由以下两种组成
- 维度外键
- 度量值
-
经常发生变化,每天会新增加很多,业务发生就会增加
类别:
- 事务型事实表 以每个事务或事件为单位,是最常用的,一般情况下只更新当天新增的业务数据
- 周期型快照事实表 不会保留所有数据,只保留固定时间间隔的数据,注重最终的结果,不注重中间的更新过程。经过一段时间之后进行 一次更新(收藏数,今天收藏的商品可能明天就取消了)
- 累积型快照事实表 跟踪业务事实的变化,更新业务的状态变更
各层建模
1.ODS层
- 保持数据原貌不做任何修改,起到备份数据的作用
- 数据采用压缩,减少磁盘存储空间
- 创建分区表(一天的数据为一个分区),防止后续的全表扫描
2.DWD层
理论上,dwd层可以满足任何业务需求,同时维表实际上就是事实表的描述角度
选择业务过程
一条业务线对应一张事实表,在业务系统中,挑选我们感兴趣的业务线,比如下单业务,支付业务,退款业务,物流业务
声明粒度
根据自己的具体业务确定力度
比如订单业务 订单中,每个商品项作为下单事实表中的一行,粒度为每次下单 订单中,每周的订单次数作为一行,粒度就是每周下单 订单中,每月的订单次数作为一行,粒度就是每月下单
确认维度
- 确定每一张事实表和哪些维度是有关联的,以此来确定具体的维度
- 完成此步就确定好事实表的外键了
确认事实 确认度量值,例如订单金额、下单次数等
维度表的确定 将和该维度有关的所有信息都汇总到一起(维度退化:维度的字段非常少,直接将维度并到事实表中),从而减少join操作提高性能
3.DWS层
dws就是以主题对象为建模的驱动然后建立宽表(分区表,统计的是当天的行为)
步骤
- 明确建哪些表 一个主题(维度)对应一张表
- 每一张表里面有哪些字段 所有和当前主题相关的事实表的度量值的统计结果 举例:和用户维度相关的有:下单 评论 支付 等等统计值,将这些度量值按照天为单位进行统计计算,主键为用户
意义
优化数仓性能,减少重复计算。比如计算同一维度的两个不同的统计值(2022年度,某省的人口数,某省的GDP增长),如果没有DWS层此时就会频繁的在DWD层进行操作,重复进行数据库查询操作,时间成本较高
4.DWT层
意义
优化数仓性能,减少重复计算,一般统计的是累积行为,不是分区表,是一张大表,存储的是全量的数据
5.ADS层
根据下层的具体需求进行相关的数据分析操作