一、聚合组
### --- 聚合组
~~~ 随着维度数目的增加,Cuboid 的数量会爆炸式地增长。
~~~ 为了缓解 Cube 的构建压力,Apache Kylin 引入了一系列的高级设置,
~~~ 帮助用户筛选出真正需要的 Cuboid(本质是要减少Cube构建过程中的预计算)。
### --- 这些高级设置包括:
~~~ 聚合组(Aggregation Group)
~~~ 强制维度(Mandatory Dimension)
~~~ 层级维度(Hierachy Dimension)
~~~ 联合维度(Joint Dimension)
二、查看cube在构建过程中聚合组的参数配置
![](https://i-blog.csdnimg.cn/blog_migrate/1831c2fefa9e763b1c5e6bb83036714c.png)
### --- 默认 Kylin 会把所有维度放在同一个聚合组中。
~~~ 如果维度数较多(如维度数 > 15),建议用户根据查询的习惯和模式,将维度分布到多个聚合组中。
~~~ 通过使用多个聚合组,可以大大降低 Cube 中的 Cuboid 数量。
### --- 如一个Cube有 (M+N) 个维度:
~~~ 这些维度放在一个聚合组中,默认有 2^(M+N) 个 Cuboid
~~~ 将这些维度分为两个不相交的聚合组,第一个组有M个维度,第二个组有N个维度。
~~~ 那么 Cuboid 的总数为:( 2^M + 2^N )个维度
~~~ 一个维度可以出现在多个聚合组中
### --- 单个聚合组中
~~~ 在单个聚合组中,可以对维度设置一些高级属性,包括强制维度、层级维度、联合维度。
~~~ 一个维度只能出现在一个属性组中。
~~~ 构建 N 个维度的 Cube 会生成 2^N个 Cuboid。
三、聚合组维度说明
### --- 聚合组维度说明
~~~ 如下图所示,构建一个 4 个维度(A,B,C, D)的 Cube,需要生成 16 个Cuboid。
![](https://i-blog.csdnimg.cn/blog_migrate/c3a4740fb2c88bfc7d382d3b0ad3149f.png)
~~~ 根据用户关注的维度组合,可以维度划分不同的组合类,这些组合类在 Kylin 中被称为聚合组。
~~~ 如用户仅仅关注维度 AB 组合和维度 CD 组合,那么该 Cube 则可以被分化成两个聚合组,
~~~ 分别是聚合组 AB 和聚合组 CD。
~~~ 生成的 Cuboid 数目从 16 个缩减为 8 个。
![](https://i-blog.csdnimg.cn/blog_migrate/95b07aed372e2f271201a829077530ea.png)
~~~ 用户关心的聚合组之间可能包含相同的维度。如聚合组 ABC 和聚合组 BCD 都包含维度 B 和维度 C。
~~~ 这些聚合组之间会衍生出相同的 Cuboid。
~~~ 聚合组 ABC 会产生 Cuboid BC,聚合组 BCD 也会产生 Cuboid BC。
~~~ 这些 Cuboid不会重复生成,一份 Cuboid 为这些聚合组所共有。
![](https://i-blog.csdnimg.cn/blog_migrate/512a95a814c9b4810f8a71accf7c76ff.png)
~~~ 有了聚合组就可以粗粒度地对 Cuboid 进行筛选,获取自己想要的维度组合。
~~~ Kylin的建模需要业务专家参与。
三、强制维度(Mandatory Dimension)
### --- 强制/必要 维度:
~~~ 指的是那些总会出现在 Where 条件或 Group By 语句中的维度。
~~~ 通过指定某些维度为强制维度,Kylin 不预计算那些不包含此维度的 Cuboid ,从而减少计算量。
~~~ 维度A是强制维度,那么生成的 Cube 如下图所示,维度数目从16变为9。
![](https://i-blog.csdnimg.cn/blog_migrate/1004ff70970aafa984a4d979d3d030ed.png)
四、层级维度(Hierachy Dimension)
### --- 层级维度:
~~~ 是指一组有层级关系的维度。
~~~ 维度中常常会出现具有层级关系的维度。
~~~ 例如国家、省份、城市这三个维度,从上而下来说国家/省份/城市之间分别是一对多的关系。
~~~ 假设维度 A 代表国家,维度 B 代表省份,维度 C 代表城市,
~~~ ABC 三个维度可以被设置为层级维度,生成的Cube 如下图所示:
~~~ Cuboid [A,C,D]=Cuboid[A, B, C, D],Cuboid[B, D]=Cuboid[A, B, D],
~~~ 因而 Cuboid[A, C, D] 和 Cuboid[B, D] 就不必重复存储。
![](https://i-blog.csdnimg.cn/blog_migrate/8761a5921dc3f348342ba3b97b00cddd.png)
五、联合维度(Joint Dimension)
### --- 联合维度:
~~~ 是将多个维度视作一个维度,在进行组合计算的时候,它们要么一起出现,要么均不出现。
~~~ # 通常适用于以下几种情形:
~~~ 总是在一起查询的维度
~~~ 彼此之间有一定映射关系,如USER_ID和EMAIL
~~~ 基数很低的维度。如性别、布尔类型的属性
### --- 维度的基数:
~~~ 维度有多少个不同的值。
~~~ 联合维度并不关心维度之间各种细节的组合方式。
~~~ 如用户的查询语句中仅仅会出现 group by A, B, C,
~~~ 而不会出现 group by A、B 或者 group by C 等等这些细化的维度组合。
~~~ 这一类问题就是联合维度所解决的问题。
### --- 例如将维度 A、B、C 定义为联合维度,
~~~ Apache Kylin 就仅仅会构建 Cuboid ABC,而 Cuboid AB、BC、A 等等Cuboid 都不会被生成。
~~~ 最终的 Cube 结果如下图所示,Cuboid 数目从 16 减少到 4。
![](https://i-blog.csdnimg.cn/blog_migrate/ccd6b6fdf20563111b1e4815561701e7.png)
六、小结:
### --- 小结:
~~~ 在单个聚合组中,可以对维度进行设置,包括强制维度、层级维度、联合维度。
~~~ 一个维度只能出现在一个属性组中
~~~ 强制维度:指的是那些总会出现在Where条件或Group By子句中的维度
~~~ 层级维度:一组具有层级关系的维度(如:国家、省、市)
~~~ 联合维度:将多个维度看成一个维度。要么一起出现、要么都不出现