做一个数仓项目的前提是需要分析指标体系,对指标体系进行一个拆分,知道一个需求指标依赖于什么指标。
1,指标体系中指标的类型
指标类型一共有三大类
原子指标:基于某一业务事件行为下的度量,是业务定义中不可再拆分的最小计算单元。
-- 业务过程(从哪张表查询)-- 度量(对哪一列进行分析) -- 聚合逻辑(count,sum等聚合方式)
“原子指标是与具体统计维度无关的”。例如,“支付金额”是原子指标,但“最近7天各渠道支付金额”是派生指标。原子指标只定义“算什么”和“怎么算(聚合方式)”,不包含“在哪算(粒度/限定)”。
派生指标:依赖于原子指标在进行进一步的聚合统计
-- 原子指标 -- 统计周期(间隔多久统计一次)-- 统计粒度(group by) -- 业务限定(where)
衍生指标:依赖于派生指标,通常需要两个派生指标进行计算,一般是占比,比率等指标的统计
-- 派生指标 -- 计算逻辑(可能是派生指标 / 派生指标,或者是基于派生指标进一步的统计)
2,具体指标的拆分,电商数仓中流量域指标体系的拆分
指标一:最近1、7、30日各渠道访客数
指标二:最近1、7、30日各渠道会话平均浏览页面数
指标三:最近1、7、30日各渠道跳出率
指标四:最近1、7、30日页面浏览路径分析
3.拆分指标的方法论
第一步:先判断这个指标是否可以再拆分。
例如上面的最近1、7、30日各渠道会话平均浏览页面数,除了我上面拆分成会话页面浏览数,拆分成这个的原因是因为有avg()聚合函数,可以直接统计。除此之外,可以拆分成页面浏览的总数以及会话的总数这两个派生指标,两者相除也可以得到这个衍生指标。
| 层级 | 指标名称 | 构成/计算逻辑 | 备注 |
|---|---|---|---|
| 衍生指标 | 各渠道会话平均浏览页面数 | 会话页面浏览总数 / 会话总数 | 最终需求指标 |
| 派生指标A | 最近N天各渠道会话页面浏览总数 | 原子指标(页面浏览数) + 周期(N天) + 粒度(渠道) | 分子 |
| 派生指标B | 最近N天各渠道会话总数 | 原子指标(会话数) + 周期(N天) + 粒度(渠道) | 分母 |
| 原子指标 | 页面浏览数 | 业务过程(页面浏览) + 度量(page_id) + 聚合(count) | 不可再分 |
| 原子指标 | 会话数 | 业务过程(会话) + 度量(session_id) + 聚合(count_distinct) | 不可再分 |
第二步:判断指标是否依赖于其他的指标。
例如,上面的最近1、7、30日各渠道跳出数量。通过分析我们可以知道,这个指标依赖于另一个指标,各会话的页面浏览次数,所以我们需要先求出页面浏览次数。
第三步:拆分出原子指标
原子指标不可再拆分,只要确定了这个指标直接就可以通过现有的表,可以直接求出来,这个指标就是原子指标。
4.抽取相同统计周期,统计粒度,业务限定的逻辑为DWS层的中间表
在指标拆分中,我们发现很多的派生指标的统计周期,统计粒度,业务限定都相同。这会造成数据的重复读取和数据的重复计算,非常影响统计分析的效率,我们就可以将这些相同的逻辑抽取出来,作为一张中间表来进行存储,后续指标计算需要用到的时候,就不需要再从头计算,而是直接就可以复用这个中间表。
DWS层就是专门用来存储这样的中间表,所以可以将这些表存储到DWS层中。后续ADS做需求分析是,优先到DWS层中找,如果有相关的表,可以直接用来计算。DWS层没有找到再去DWD + DIM层寻找。因为对于一些特定需求的指标,我们就没有必要抽取出来中间表,这样反倒会影响性能,毕竟中间表需要落盘,额外会消耗资源。