一、ODS层
ODS层的作用:保存原始数据,不作任何处理
ODS层主要存储的是用户行为日志数据 和 关系型数据库中业务数据
(1)HDFS用户行为日志数据
用户行为数据建表思路:
- 只需要创建一张分区表
- 表中的每行数据就是一条日志
- 字段只需要一个String类型的即可
- 按天分区,每个分区就是当天采集的日志数据
(2)HDFS业务数据
业务数据建表思路:
- 参照mysql建表即可,同步mysql中的表
- 表中的每行和mysql中的每行数据保持一致即可
- 字段跟mysql表中的字段保持一致
- 按天分区,每天一个分区,分区中存储的数据为关系型数据库同步过来的数据
二、DIM层和DWD层
DIM层的作用:保存维度数据、主要是对业务师生的描述信息,例如 何人,何时,何地等
DWD层的作用:对ODS层数据进行清洗,保存业务事实明细,一行信息代表一次业务行为,例如一次下单
- DWD层存放的就是维度模型的事实表
- DIM层存放的是维度模型的维度表
- DIM层DWD层需构建维度模型,一般采用星型模型,呈现的状态一般为星座模型
维度建模一般按照以下四个步骤:
选择业务过程→声明粒度→确认维度→确认事实
(1)选择业务过程
在业务系统中,挑选我们感兴趣的业务线,比如下单业务,支付业务,退款业务,物流业务,每一条业务线对应一张事实表
选择业务过程其实就是确定需要建哪些事实表
(2)声明粒度
粒度定义:数据粒度指数据仓库的数据中保存数据的细化程度或综合程度的级别;简单来说数据越明细粒度越小,数据越汇总或综合粒度越大
作用:声明粒度意味着精确定义事实表中的一行数据表示什么,应该尽可能选择最小粒度,以此来应各种各样的需求
例如::
订单事实表中一行数据表示的是一个订单中的一个商品项。
支付事实表中一行数据表示的是一个支付记录。
声明粒度就是确定表结构中的每行数据是什么
(3)确认维度
确认维度实际上确认的是与每张事实表的相关维度有哪些
例如:有个订单业务,该业务会对应有一个订单事实表,其中与订单相关的维度的有 用户维度、时间维度、地区维度、商品维度等等。
确认维度实际上就是确定事实表的维度外键有哪些
(4)确认事实
此处的“事实”一词,指的是业务中的度量值(次数、个数、件数、金额,可以进行累加),例如订单金额、下单次数等
通过第三步和第四步就可以把每张事实表的字段确定下来
三、DWS层与DWT层
DWS层和DWT层统称宽表层,这两层的设计思想大致相同
主要作用:提高数据的复用性,避免重复计算
DWD按天进行轻度汇总
DWS对数据进行累计汇总
(1)问题引入:
需求一:统计每个省份订单的个数
需求二:统计每个省份订单的总金额
(2)处理办法:
两个需求都是将省份表和订单表进行join,group by省份,然后计算。同样数据被计算了两次,实际上类似的场景还会更多
(3)那怎么设计能避免重复计算呢?
针对上述场景,可以设计一张地区宽表,其主键字段为地区ID,剩余字段为地区维度表相关联的事实表的度量值的聚合值,其中包含:下单次数、下单金额、支付次数、支付金额、退单的次数退单的金额等。需要从DWD层将上述所有指标都统一进行计算聚合,并将结果保存在该宽表中;如果后续再有这样的需求,就不用再分开或者分别去统计,直接从宽表中获取想要的结果就可以了,这样就能有效避免数据的重复计算
宽表存的都是与维度表相关的事实表的度量值的聚合值
(4)宽表的设计思想
- 首先我们需要知道创建那些表?
宽表创建以维度为基准,有什么维度就对应的创建什么样的宽表 如:上面的是地区维度,那么就创建地区主题的宽表;如果是用户维度,那么就创建用户主题的宽表等等 - 宽表中的字段怎么确定
每张宽表的主键对应的是维度的ID,其余字段都是与维度表相关的事实表的度量值的聚合值
(5)DWS层与DWT层的不同
DWS层只会把当天的数据进行聚合**(轻度汇总),而DWT会把最近N天的数据聚合起来(累计汇总)**
(6)总结
- 需要建哪些宽表:以维度为基准
- 宽表里面的字段
①宽表的主键字段对应的是维度的ID
②其余字段都是与维度表相关的事实表的度量值的聚合值 - DWS和DWT层的区别:DWS层存放的所有主题对象当天的汇总行为,例如每个地区当天的下单次数,下单金额等,DWT层存放的是所有主题对象的累积行为,例如每个地区最近7天(15天、30天、60天)的下单次数、下单金额等
四、ADS层
ADS层建表是根据需求进行创建的,该层保存的是各种应用的计算结果,计算结果是什么数据,就创建什么表进行保存即可
ADS层作用之一,为各种统计报表提供数据
参考:atguigu