(1). 前言
自己没有数仓的相关积累,最近被安排出差做数仓项目,以前认为,无非不过是采集数据,然后,把数据放到HDFS里,然后再进行计算出结果就好了.
结果: 客户比自己更加的精通数仓,深入一学习,数仓有着一套自己的术语以及管理方法.
(2). 数仓分层介绍
ODS层: Operation Data Store
数据准备区,也称为贴源层,数据仓库源头系统的数据表通常会原封不动的存储一份,这称为ODS层,是后续数据仓库加工数据的来源.
1. 保持数据的原汁原味,不做任何修改,有效的备份数据的作用.
2. 数据采用压缩,减少磁盘存储空间.
3. 创建分区表("按天分区"),防止全表扫描.
DW层:
DWD : Data Warehouse Detail
该层主要存放:业务事实表信息.
细节数据层,是业务层与数据仓库的隔离层.它的结构和粒度与ODS表保持一致,对ODS层数据进行清洗(去除空值/脏数据/脱敏/退维)等操作.
DIM: Dimension(维度层)
该层主要:存放维度表信息.
DWS : Data Warehouse Summary
在DWD的基础上,"按天轻度汇总".
DWT : Data Warehouse Topic
以DWS为基础,对数据进行"累积汇总".
ADS层: Application Data Store
该层主要是提供数据产品和数据分析使用的数据,一般会存储在ES、MySQL等系统中供线上系统使用.
(3). 数据集市(Data Mark)
数据集市是一种微型的数据仓库,它通常有更少的数据,更少的主题区域,以及更少的历史数据,因此是”部门级”的,一般只能为某个局部范围内的管理人员服务,而数仓一般是”企业级”,它的目的是为整个企业各个部门提供决策支持手段.
(4). 为什么要分层?
- 隔离原始数据,将原始数据用作备份.使真实数据与统计数据解耦开.
- 复杂问题简单化,将复杂的原始数据进行拆解多层,每一层的处理难度低,方便定位.
- 减少了开发的重复性,规范了数仓建设,极大的减少了重复的计算,增加了计算的结果复用性.
(5). 关系模型与维度模型
关系模型严格遵循第三范式(3NF),较松散零碎,物理表数量多,数据冗余程度低.
由于数据分布于众多的表中,这些数据可以更为灵活地被应用,功能性较强.主要应用于OLTP系统中,保证数据的一致性以及避免冗余,所以大部分业务系统的表都遵循第三范式.
维度模型主要应用于OLAP系统中,通常以某一个事实表为中心进行表的组织,主要面向业务,特征是可能存在数据的冗余,但是能方便的得到数据.
关系模型虽然冗余少,但是在大规模数据,跨表分析统计查询过程中,会造成多表关联,这会大大降低执行效率(凡涉及到join就会造成要在内存中进行数据过滤).所以通常采用维度模型建模,把相关各种表整理成两种:事实表和维度表.
(6). 维度模型分类
星型模型:
标准的星型模型维度只有一层,而雪花模型可能会涉及多级,维度层级 是雪花模型与星型模型的主要区别.
雪花模型:
雪花模型比较接近3NF,但是无法完全遵循,因为遵循3NF的性能成本太高.
星座模型:
星座模型与前两种情况的区别是”事实表的数量”,星座模型是基于”多个事实表”.
基本上是很多数据仓库的常态,因为很多数据仓库都是多个事实表.所以是否星座只反应是否有多个事实表,它们之间是否共享一些维度表.星座模型不和前两种模型冲突.
(7). 维度建模案例
维度建模是以数据分析为出发点,不遵循三范式,故数据存在一定的冗余,”维度模型面向业务”,将业务用事实表和维度表呈现出来,表结构简单,故查询简单,查询效率较高.
- 维度表:一般是对业务事实的描述信息,每一个维度表对应现实世界中的一个对象或者概念(比如:用户/商品/日期/地区).
- 事实表:所谓的事实表是指:”业务事件的度量值”(比如:统计每个商品每天的下单次数/统计商品每日的下单总金额),业务事实表中的每一行代表一个业务事件(比如:下单记录/支付记录/退款记录/加购物车记录/收藏记录),事实表一般由:”维度表外键ID和度量值组成”.
- 案例需求如下:张三 2021-09-20 在京东商城 购买了一件商品 花了100圆钱 ,收货地址为:广东省深圳市 –> 订单事实表(user_id/time_id/product_id,address,buy_num,amount)
(8). 建模步骤
- 业务模型(先分出主题)
- 以业务的维度进行业务建模(比如:客户/商品/订单,可以,把客户归纳为:用户主题,把商口和订单归纳为:订单主题).
- 领域(概念)模型
- 是从用户的角度出发,做概要设计(比如:商品).
- 逻辑模型
- 对概念模型的补充,仅仅只设计表与表之间的关系,表有哪些字段之类的(比如:商品ID/商品名称/商品价格/商品所属品牌).
- 物理模型
- 主要解决针对不同的数据库的物理化以及性能等一些具体的技术问题.
(9). 数仓命名规范
- ODS层: 主题名称_ods(例如:order_ods)
- DWD层: 主题名称_dw(例如:order_dw)[dim_product/dim_customer/fact_order]
(10). 数仓表命名规范
- ODS层命名为: ods_表名称
- DWD层命名为: dwd_dim_表名称 / dwd_fact_表名称
- DWS层命令为: dws_表名称
- DWT层命名为: dwt_表名称
- ADS层命名为: ads_表名称
(11). ODS建模思想
ODS层一般存放的是原始数据,一般分区存放(按天),并压缩,之所以做这一层的目的是为了:使真实数据与统计数据解耦开.
(12). DWD建模思想
DWD层需要构建维度模型,一般采用星型模型.
维度建模一般按照以下四个步骤:
1. 选择业务过程: 选择有业务价格的业务线,比如:下单业务/支付业务/退款业务/物流业务,每一条业务线对应一张”事实表”.
2. 声明粒度: 是指数据仓库中保存数据的细化程度(注意:要尽可能的选择最小粒度),比如:订单和订单详细,建议选择订单的详细为粒度.
3. 确认维度: 确认业务事实与哪些维度表有关系(比如:时间/用户/优惠券/活动).
4. 确认事实: 确认事实表里的维度外键和度量值.
(13). DWS/DWT建模思想
DWS/DWT都是站在”维度表”的角度去看”事实表”,重点关注事实”聚合后的度量值”,例如:查看某一地区下单次数/查看某一地区下单总金额等等,所以,可以建一张宽表来存储这些字段(location_id/total_count/total_money),这样就不需要进行实时查询了.
DWS存放的是所有主题对象”当天汇总”行为,DWT存放的是所有主题对象”累积”行为.
(13). ADS建模思想
ADS层是根据业务的需求来决定存放哪些数据.