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

随着维度数目的增加,Cuboid 的数量会爆炸式地增长。为了缓解 Cube的构建压力,Apache Kylin 引入了一系列的高级设置,帮助用户筛选出真正需要的 Cuboid。这些高级设置包括聚合组(Aggregation Group)、联合维度(Joint Dimension)、层级维度(Hierachy Dimension)和必要维度(Mandatory Dimension)等。

聚合组(Aggregation Group)

用户根据自己关注的维度组合,可以划分出自己关注的组合大类,这些大类在 Apache Kylin 里面被称为聚合组。例如图 1 中展示的 Cube,如果用户仅仅关注维度 AB 组合和维度 CD 组合,那么该 Cube 则可以被分化成两个聚合组,分别是聚合组 AB 和聚合组 CD。如图 2 所示,生成的 Cuboid 数目从 16 个缩减成了 8 个。

用户关心的聚合组之间可能包含相同的维度,例如聚合组 ABC 和聚合组 BCD 都包含维度 B 和维度 C。这些聚合组之间会衍生出相同的 Cuboid,例如聚合组 ABC 会产生 Cuboid BC,聚合组 BCD 也会产生 Cuboid BC。这些 Cuboid不会被重复生成,一份 Cuboid 为这些聚合组所共有,如图 3 所示。

有了聚合组用户就可以粗粒度地对 Cuboid 进行筛选,获取自己想要的维度组合。

层级维度(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 所示。

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

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

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

联合维度(Joint Dimension)

用户有时并不关心维度之间各种细节的组合方式,例如用户的查询语句中仅仅会出现 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 结果如图 2 所示,Cuboid 数目从 16 减少到 4。

由于在hbase中只存在cubeid ABC,所以在查询是只能通过ADC来搜索cubeid, 例如设置联合维度: [cal_dt, city, sex_id]

SELECT cal_dt, city, sex_id, count(*) FROM table GROUP BY cal_dt, city, sex_id

则它将从Cuboid [cal_dt, city, sex_id]中获取数据

SELECT cal_dt, city, sex_id, count(*) FROM table GROUP BY cal_dt, city

遇到不存在的cubeid时,kylin会选择在线计算的方式,从现有的 Cuboid 中计算出最终结果。

必要维度(Mandatory Dimension)

用户有时会对某一个或几个维度特别感兴趣,所有的查询请求中都存在group by这个维度,那么这个维度就被称为必要维度,只有包含此维度的Cuboid会被生成(如图2)

以图 1中的Cube为例,假设维度A是必要维度,那么生成的Cube则如图3所示,维度数目从16变为9。

derived 衍生维度

如果是衍生维度的话,则必须是来自于某个维度表,由于这些列值都可以从该维度表的主键值中衍生出来,所以实际上只有主键列会被Cube加入计算。而在Kylin的具体实现中,往往采用事实表上的外键替代主键进行计算和存储。但是在逻辑上可以认为衍生列来自于维度表的主键。

参考:
http://cn.kyligence.io/blog/page/11/
Apache Kylin 权威指南 (链接:https://pan.baidu.com/s/1pLNxdpD 密码:ww7s)

kylin 维度优化,Aggregation Group,Joint,Hierachy,Mandatory等解析相关推荐

  1. POJ3666 线性dp+维度优化

    POJ3666 线性dp+维度优化 题面 POJ3666 题面 思路 首先是重要的归纳法寻求思路的思想,在满足S最小化的前提下,假设存在一种构造前k位序列B的方案,即已经构造B1B2⋯BkB_1B_2 ...

  2. mysql的优化器执行过程(附代码解析,手动注释等)

    一.前言 这篇文章的诞生很偶然,优化器大家基本都听过,感觉就是只要自己不能理解的东西,都归于mysql优化器就完事了,哈哈.但是优化器到底是什么呢,执行过程是什么样子的呢?博主是在看一篇博文的时候,看 ...

  3. 【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 详细建模过程解析及代码实现

    相关信息 (1)建模思路 [2023 年第十三届 MathorCup 高校数学建模挑战赛]A 题 量子计算机在信用评分卡组合优化中的应用 详细建模过程解析及代码实现 [2023 年第十三届 Matho ...

  4. Mysql优化之GROUP BY语句优化

    一.首先看Group By创建临时表的情况,因为有临时表的存在所以索引失效. 如果GROUP BY 的列没有索引,产生临时表 如果GROUP BY时,SELECT的列不止GROUP BY列一个,并且G ...

  5. MYSQL优化-之GROUP BY

    2019独角兽企业重金招聘Python工程师标准>>> 在web应用中,提倡sql简单,避免复杂度.所以在我们公司的应用中看不到jon,子查询等语句的存在,所以间接GROUP BY  ...

  6. Android深度性能优化-更底层、全局、多维度优化

    很多年没更新博客了,写博客这件事真的不能停,一停下来就完全不知道该怎么开始了.深圳的天气格外的美,蓝天白云.绿树,最近公司放大假,由于担心疫情原因没有出去玩,呆着家里无聊居然想写点东西.博客上次更新还 ...

  7. 【MySQL从入门到精通】【高级篇】(二十八)子查询优化,排序优化,GROUP BY优化和分页查询优化

    您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦.

  8. [从零手写VIO|第五节]——后端优化实践——单目BA求解代码解析

    长篇警告⚠⚠⚠ 目录 solver 全流程回顾 Solver三要素 Solver求解中的疑问 核心问题 代码解析 1. TestMonoBA.cpp 2. 后端部分: 2.1 顶点 2.2 边(残差) ...

  9. sql中group by 和having 用法解析

    --sql中的group by 用法解析: -- Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)". --它的作用是通过一定的规则将一 ...

  10. 因子图优化原理(iSAM、iSAM2论文解析)

    因子图优化原理(iSAM.iSAM2) slam问题 通过贝叶斯网络对slam问题建模 从贝叶斯网络到因子图 非线性最小二乘问题求解 isam1增量QR分解 isam2 结语 slam问题 在介绍因子 ...

最新文章

  1. 特奇怪的问题:centos5下mount.cifs 与apache2.2.3和vsftpd结合
  2. PHP 2014.5.21的总结:
  3. SpringCloud微服务:阿里开源组件Nacos,服务和配置管理
  4. vue 打开html流_解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题...
  5. linux服务之irqbalance
  6. 《疯狂的程序员》绝影新闻
  7. 生产订单管理系统软件哪家好?
  8. 摄氏温度和华氏温度相互转换(及其概念)
  9. PR-Place-performing Placement and Optimization-1
  10. (总结)Web性能压力测试工具之Siege详解
  11. 使用多线程爬取笔趣阁
  12. 站长统计工具区别:百度统计、51la统计系统和cnzz数据统计工具
  13. Zend与PHP之间到底是什么关系
  14. Bundle Adjustment — A Modern Synthesis(一)
  15. 只能输入数字的正则表达式
  16. 热温冷冰,数据存储需要全生命周期管理
  17. MT2502 datasheet,MT2502硬件设计,MT2502芯片资料
  18. 山东科技大学计算机调剂难吗,山东科技大学 材料专业 调剂 求老师带走 国家线总分单科不都受限 - 考研 - 小木虫 - 学术 科研 互动社区...
  19. MYSQL docker镜像简单安装数据库
  20. 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。例如, 罗马数字 2 写做 II ,即为两个并列的 1

热门文章

  1. 快速排序(c语言实现)
  2. LayaBox引擎源码阅读笔记(四、文本渲染原理相关)
  3. 大学英语四六级13年12月大改革应对办法全套复习规划
  4. 怎么修改PDF文件中的文字?快来学这两种方法
  5. 红米note2 解账号锁、救砖 (附刷机包,工具)
  6. 各种文件后缀名与打开方式大全
  7. PHP家庭账单系统,家庭财务管理系统1.0【PHP版】
  8. 制作PPT和画报的免费素材:pixabay免费照片插图矢量图
  9. 怎么把几段音频文件合并成一个
  10. Windows下MongoDB下载,安装和初级使用