背景:在开发过程中,往往有业务方有计算不同统计粒度指标需求,在数据量比较小的情况,直接提供底层明细表给到看板,通过看板模块筛选后再聚合计算即可,但是在数据量比较大的情况下,看板侧每次筛选完维度之后,都需要运行很久,不仅占用资源,而且体感很差,那么在这种情况下,我们就可以使用cube结构,提取计算好不同维度组合下的指标,再提供给看板。
一、Cube结构:多维数据分析的核心框架
-
基本定义与组成
Cube是一种多维数据结构,用于支持大型数据集的快速分析。它通过维度(如时间、地理、产品)、度量(如销售额、请求量)、粒度(数据详细程度)和层次结构(维度内的层级,如年-月-日)构建数据模型11。例如,在分析请求耗时场景中,"系统-模块-小时"可构成关键维度,耗时则作为度量值。 -
实现方式:星型模式与事实表
Cube通常通过星型模式实现,包含一个事实表(记录具体业务数据,如请求耗时)和多个维度表(描述维度属性,如系统名称、模块分类)。这种结构通过外键关联,既压缩了存储空间,又提升了查询效率1。例如,将每小时请求的耗时统计存储在事实表中,维度表分别描述系统和模块的元数据。 -
应用价值
Cube支持灵活的多维钻取、切片和切块操作。例如,用户可先查看系统A1的整体耗时,再下钻到模块B1的小时级分位数曲线,并通过时间维度对比不同周期的性能变化。
二、GROUPING SETS:多维聚合的灵活扩展
-
功能定位
GROUPING SETS是SQL中用于多维度聚合的语法,允许在单次查询中生成多组不同粒度的汇总结果。相比传统的GROUP BY,它避免了多次查询的冗余计算,尤其适用于海量数据分析场景4。 -
典型应用场景
- 部分维度组合分析:例如同时计算(系统+模块)、(系统+小时)、(模块+小时)的聚合结果,无需多次查询。
- 层次化汇总:生成从粗粒度(如系统级别)到细粒度(系统+模块+小时)的多层统计1。
- 语法示例:HiveSQL
SELECT nvl(systom, 'all') as systom,
nvl(model, 'all') as model,
nvl(class, 'all') as class,
sum(time_cost)
FROM
(
SELECT 'A' AS systom, 'a' AS model, 1 AS class, 100 AS time_cost UNION ALL
SELECT 'A' AS systom, 'b' AS model, 2 AS class, 100 AS time_cost UNION ALL
SELECT 'A' AS systom, 'b' AS model, 2 AS class, 100 AS time_cost UNION ALL
SELECT 'B' AS systom, 'b' AS model, 1 AS class, 100 AS time_cost
)tmp
GROUP BY systom,
model,
class
GROUPING sets((systom), (systom,model), (systom,class))
统计了不同systom粒度、systom+model、systom+class下的总耗时
GROUPING sets | systom | model | class | sum(time_cost) |
(systom) | A | all | all | 300 |
B | all | all | 100 | |
(systom,model) | A | a | all | 100 |
A | b | all | 200 | |
B | b | all | 100 | |
B | all | all | 100 | |
(systom,class) | A | all | 1 | 100 |
A | all | 2 | 200 | |
B | all | 1 | 100 |