超全面试总结——数据仓库
如何理解数仓
- 数据仓库就是整合多个数据源的历史数据进行细粒度的、多维度的分析,帮助高层管理者或者业务分析员做出决策。
- 数据仓库是一个面向主题的、集成的、随时间变化的、但信息本身相对稳定的数据集合,用于对管理决策过程的支持。
为什么要数据仓库建模
- 性能:良好的模型能帮我们快速查询需要的数据,减少数据的IO吞吐
- 成本:减少数据冗余、计算结果复用、从而降低存储和计算成本
- 效率:改善用户使用数据的体验,提高使用数据的效率
- 改善统计口径的不一致性,减少数据计算错误的可能性
为什么要设计数据分层
- 需要一套行之有效的数据组织和管理方法来让我们的数据体系更有序
- 复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题,
- 清晰数据结构:每一个数据分层都有它的作用域和职责,在使用表的时候能够更方便地定位和理解
- 数据血缘追踪:当数据出现问题之后,快速准确地定位到问题,并清楚它的危害范围
- 减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算,用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据。
- 统一数据口径:通过数据分层,提供统一的数据出口,统一对外输出的数据口径
通用的数据分层设计
-
数据运营层 ODS、数据仓库层 DW(DWD、DWM、DWS)、数据应用层 ADS、维表层
-
数据运营层 ODS (Operational Data Store) 面向主题的
- 接入的是原始数据,一般不做处理
- 参考Sqoop导入的数据类型进行建模,Canal 监听 Mysql 的 Binlog,埋点日志,Flume,Kafka等
- 在ODS层中,由于各端的开发团队不同PC端、H访问、小程序等或者各种其它问题,用户的访问日志被分成了好几张表上报到了我们的ODS层。
- ODS层数据还起到一个数据备份作用,如果是比较特殊行业,在ODS层的数据会保留一年甚至多年.不过普通公司一般就保存3–6个月,看数据量和存储压力以及存储预算决定.
-
数据仓库层 DW ( Data Warehouse)
-
存放我们要重点设计的数据仓库中间层数据
-
数据明细层 DWD( Data Warehouse Detail)
- 对ODS层数据做一定的清洗和主题汇总
- DWD层做了一张用户访问行为日志表,在这里,我们将PC网页、H5、小程序和原生APP访问日志汇聚到一张表里面,统一字段名,对部分枚举类型的值进行翻译,剔除异常数据,字段命名规范化、时间字段的统一,保证质量。
- 提高易用性,采用维度退化手法(把几个维度放在一起),将商品一二三级分类表,sku商品表,spu商品表,商品品牌表合并汇总为一张维度表!
-
数据中间层 DWM (Data WareHouse Middle)
- 对明细数据按照常用维度做初步的汇总
- 选取业务关注的核心维度来做聚合操作,比如只保留人、商品、设备和页面区域维度,计算出常用的统计指标:次数、时长。用户访问天表,用户登陆行为天表,订单行为天表
- 对数据做轻度的聚合操作,生成中间表,提升公共指标的复用性,减少重复加工
-
数据服务层 DWS (Data WareHouse Servce)
- 又称数据集市或宽表
- 将一个人在整个网站中的行为数据放到一张表中,构建商品、商铺、地址主题宽表,更多用户相关的指标:登陆次数、访问次数、添加购物车次数、购买商品数、购买不同商品数、购买金额,时间维度数据:天、月级的数据。
- 按照业务划分,生成字段比较多的宽表,用于提供后续的业务查询,OLAP分析,数据分发等。
-
在实际计算中,如果直接从DWD或者ODS计算出宽表的统计指标,会存在计算量太大并且维度太少的问题,因此一般的做法是,在DWM层先计算出多个小的中间表,然后再拼接成一张DWS的宽表。
-
dws和dwd是并行的
-
-
数据应用层 APP (Application)
- 面向业务定制的应用数据
- 主要是提供给数据产品和数据分析使用的数据
- 报表数据存放在这
- 维表层 (Dimension)
- 高基数维度数据:一般是用户资料表、商品资料表类似的资料表。数据量可能是千万级或者上亿级别。
- 低基数维度数据:一般是配置表,比如枚举值对应的中文含义,或者日期维表。数据量可能是个位数或者几千几万。
分层的原则是什么?
- 从对应用的支持来讲,我们希望越靠上层次,越对应用友好。比如APP层,基本是完全为应用来设计的,很易懂,DWS层的话,相对来讲就会有一点点理解成本,然后DWM和DWD