1. 多维分析是什么
多维分析行业内也叫群切,就是从多个不同维度(地域、机型、页面、时间等)对指标(访问次数、人数、会话时长等)做聚合统计,用来做多张运营报表。
- 维度:分析的角度(省份、城市、手机型号、入口页、性别、班级等)
- 指标:统计出来的数值(会话总次数、访问人数、平均会话时长、总销售额等)
传统写法:有多少种维度组合,就要写多少条GROUP BYSQL,重复代码多、维护麻烦。于是诞生三个高阶聚合函数:GROUPING SETS、ROLLUP、CUBE,一条 SQL 一次性算出所有需要的维度组合结果。常见工具:Hive/SparkSQL、Apache Doris、Kylin(预计算多维立方体引擎)。
2. 流量多维分析业务场景举例
围绕用户流量行为,从不同维度组合统计流量核心指标:
- 地域维度:省份、城市
- 设备维度:手机型号
- 行为维度:入口页面
- 核心指标:会话总次数、访问人数、平均每人会话数、会话总时长、平均会话时长
业务难点:入口页无法直接取字段,需要从会话第一条eventid=pageView事件中提取首次访问的 URL 作为入口页。
3. 三个多维聚合函数核心作用
GROUPING SETS:自定义需要哪些维度组合,只计算你指定的分组ROLLUP:层级上卷聚合,从细粒度逐级汇总到粗粒度,类似 “逐层向上汇总”CUBE:全维度交叉聚合,所有维度自由两两、多两组合,生成所有可能的维度组合结果
4. 开发价值
提前梳理所有报表需要的维度组合,用一个 SQL 算出全部结果,定时调度落地,不用重复写几十条分组 SQL,大幅精简代码。
三大多维函数详细讲解(Doris 实操版)
前置基础概念
1. 维度 & 指标举例
表:用户访问流量表维度:省份、城市、手机型号指标:会话次数、访问人数
- 单维度:只按省份统计
- 多维度:省份 + 城市、省份 + 手机型号
- 总计:全表所有数据汇总
2. GROUPING SETS(自定义维度组合)
作用
手动指定你需要哪几组维度组合,只计算你配置的分组,不多算冗余数据。相当于把多条GROUP BY合并成一条 SQL。
示例
需要三种统计:
- 按省份分组
- 按省份、城市分组
- 全表总访问量
SELECT province,city,COUNT(session_id) AS visit_cnt FROM user_flow GROUP BY GROUPING SETS ( (province), (province,city), () );()代表不分组,全局聚合,求总计
适用场景:报表需要的维度组合零散,不需要全部层级 / 全部交叉,精准按需计算。
3. ROLLUP:层级上卷(爬楼梯式逐级汇总)
核心规则
ROLLUP(A,B,C)遵循从最细粒度 → 逐级向上汇总的层级顺序:
- (A,B,C) 最细粒度分组
- (A,B) 向上一级汇总
- (A) 再向上一级汇总
- () 全局总计
为什么没有(B,C)?
ROLLUP 严格遵循维度传入的先后层级顺序,只做「从左往右逐层去掉最右侧维度」向上汇总,不会打乱维度顺序、不会从中间截取维度组合。
想要
(B,C)这类跨层级维度组合,只能用 GROUPING SETS 或 CUBE。
业务场景:地域层级汇总(省→市→区县)
需求:统计各区县、各市、各省、全国总访问人数
SELECT province,city,district,COUNT(user_id) AS user_cnt FROM user_flow GROUP BY ROLLUP(province,city,district);等价于:
GROUP BY GROUPING SETS( (province,city,district), (province,city), (province), () )特点
- 维度有明确先后层级关系:省包含市、市包含区县,不能乱序
- 只做从上到下的层级汇总,不会颠倒维度交叉组合
- 适合:地区层级、时间层级(年→季→月→日)、部门层级报表
你文中 Doris 示例解析
SELECT city,type,type_msg, sum(amount) FROM huiyuan_msg GROUP BY ROLLUP(city,type,type_msg);生成分组:
- city+type+type_msg
- city+type
- city
- 全局汇总
4. CUBE:全维度交叉立方体(所有组合全部计算)
核心规则
CUBE(A,B)会生成所有维度的任意组合,不限制层级顺序,全部交叉统计。
CUBE(city,type)等价于 4 组维度:
- city + type
- city
- type
- 全局总计
Doris 示例
SELECT city,type, sum(amount) FROM huiyuan_msg GROUP BY CUBE(city,type);特点
- 维度之间没有层级从属关系,可以任意交叉
- 会生成所有维度排列组合,结果数据量比 ROLLUP 多
- 适用:需要做多维度交叉分析,比如省份 × 机型、省份 × 入口页、机型 × 入口页所有组合报表
ROLLUP 和 CUBE 核心区别
- ROLLUP:有层级,从上往下逐级汇总,维度有序,结果少例:省、市、区县,只能向上汇总,不会单独按市汇总全国
- CUBE:无层级,所有维度自由交叉排列,全部组合都计算,结果多例:省份、手机型号,既可以省 + 机型,也可以单独按机型全局统计
三者关系梳理
GROUPING SETS:手动自定义分组,灵活可控,想算哪几组就写哪几组ROLLUP:特殊的 GROUPING SETS,按维度层级向上汇总,适合层级类维度(地域、时间)CUBE:特殊的 GROUPING SETS,所有维度全部交叉组合,适合多维度交叉分析
选择建议
- 维度存在层级(年 / 月 / 日、省 / 市 / 区)→ 用
ROLLUP - 多个维度需要任意交叉组合 → 用
CUBE - 只需要零散几个特定维度组合 → 用
GROUPING SETS
配套业务补充说明
Kylin(麒麟)多维预计算引擎,提前把所有 CUBE 维度组合结果算好落地,前端查询直接读预计算结果,适合超大规模离线多维报表查询加速。Doris 本身可以实时多维聚合,实时场景优先 Doris,超大离线预计算场景用 Kylin。
流量分析难点:入口页提取入口页不能直接作为维度字段,需要先对同一个会话下的所有页面浏览事件排序,取会话第一条 pageView 事件的 url 作为该会话的入口页,再基于加工后的入口页维度做多维聚合。
工程化落地方式业务梳理全部维度组合 → 使用 ROLLUP/CUBE 单条 SQL 一次性计算所有报表指标 → 结果写入结果表 → 配置定时任务每日调度,报表直接查询结果表即可。
背诵总结
- 多维分析(群切):多维度聚合统计业务指标,传统 GROUP BY 需要多条 SQL,可用三个高阶函数优化。
GROUPING SETS:自定义指定维度组合,按需聚合。ROLLUP:层级上卷聚合,适用于省市区、年月日这类有从属层级的维度,逐级向上汇总。CUBE:全维度交叉聚合,所有维度任意组合,适合无层级多维度交叉分析。- 常用引擎:Hive/SparkSQL、Doris 实时多维分析,Kylin 用于多维预计算加速查询。