网中网 发表于 2018-11-18 06:46:10

【技术帖】Apache Kylin 高级设置:层级维度(Hierarchy Dimension)原理

众所周知,Apache Kylin 的主要工作就是为源数据构建 N 个维度的 Cube,实现聚合的预计算。理论上而言,构建 N 个维度的 Cube 会生成 2N 个 Cuboid, 如图 1 所示,构建一个 4 个维度(A,B,C, D)的 Cube,需要生成 16 个Cuboid。

  (图1)
  随着维度数目的增加 Cuboid 的数量会爆炸式地增长,不仅占用大量的存储空间还会延长 Cube 的构建时间。为了缓解 Cube 的构建压力,减少生成的 Cuboid 数目,Apache Kylin 引入了一系列的高级设置,帮助用户筛选出真正需要的 Cuboid。这些高级设置包括聚合组(Aggregation Group)、联合维度(Joint Dimension)、层级维度(Hierarchy Dimension)和必要维度(Mandatory Dimension)等。
  本文将着重介绍层级维度(Hierarchy Dimension)的实现原理与适用的场景实例。
  层级维度
  用户选择的维度中常常会出现具有层级关系的维度。例如对于国家(country)、省份(province)和城市(city)这三个维度,从上而下来说国家/省份/城市之间分别是一对多的关系。也就是说,用户对于这三个维度的查询可以归类为以下三类:

[*]  group by country
[*]  group by country, province(等同于group by province)
[*]group by country, province, city(等同于 group by country, city 或者group by city)
  以图 2 所示的 Cube 为例,假设维度 A 代表国家,维度 B 代表省份,维度 C 代表城市,那么ABC 三个维度可以被设置为层级维度,生成的Cube 如图 2 所示。

  (图2)
  例如,Cuboid =Cuboid,Cuboid=Cuboid,因而 Cuboid 和 Cuboid 就不必重复存储。
  图 3 展示了 Kylin 按照前文的方法将冗余的Cuboid 剪枝从而形成图 2 的 Cube 结构,Cuboid 数目从 16 减小到 8。

  (图3)
  应用实例
  假设一个交易数据的 Cube,它具有很多普通的维度,像是交易的城市 city,交易的省 province,交易的国家 country, 和支付类型 pay_type等。分析师可以通过按照交易城市、交易省份、交易国家和支付类型来聚合,获取不同层级的地理位置消费者的支付偏好。在上述的实例中,建议在已有的聚合组中建立一组层级维度(国家country/省province/城市city),包含的维度和组合方式如图 4:

  (图4)
  聚合组:
  层级维度:
  Case 1 当分析师想从城市维度获取消费偏好时:
  SELECT city, pay_type, count(*) FROM table GROUP BY city, pay_type 则它将从 Cuboid 中获取数据。
  Case 2 当分析师想从省级维度获取消费偏好时:
  SELECT province, pay_type, count(*) FROM table GROUP BY province, pay_type则它将从Cuboid 中获取数据。
  Case 3 当分析师想从国家维度获取消费偏好时:
  SELECT country, pay_type, count(*) FROM table GROUP BY country, pay_type则它将从Cuboid 中获取数据。
  Case 4 如果分析师想获取不同粒度地理维度的聚合结果时:
  无一例外都可以由图 3 中的 cuboid 提供数据 。
  例如,SELECT country, city, count(*) FROM table GROUP BY country, city 则它将从 Cuboid 中获取数据。

页: [1]
查看完整版本: 【技术帖】Apache Kylin 高级设置:层级维度(Hierarchy Dimension)原理