Kylin 维度高级设置

来源公众号:apachekylin

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


cube

随着维度数目的增加 Cuboid 的数量会爆炸式地增长,不仅占用大量的存储空间还会延长 Cube 的构建时间。为了缓解 Cube 的构建压力,减少生成的 Cuboid 数目,占用存储空间,同时提高查询性能,Apache Kylin 引入了一系列的高级设置,帮助用户筛选出真正需要的 Cuboid。这些高级设置包括聚合组(Aggregation Group)联合维度(Joint Dimension)层级维度(Hierachy Dimension)必要维度(Mandatory Dimension)等。

聚合组

聚合组适用于粗粒度地关注某些维度去进行分组聚合的场景。

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


aggregation

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


aggregation

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

应用实例

假设创建一个交易数据的 Cube,包含了以下一些维度:顾客 ID(buyer_id)、交易日期(cal_dt)、付款方式(pay_type)和买家所在的城市(city)。分析师有时候需要通过分组聚合 city 、cal_dt 和 pay_type 来获知不同消费方式在不同城市的应用情况;有时候,需要通过聚合 city 、cal_dt 和 buyer_id,来查看顾客在不同城市的消费行为。

在上述的实例中,推荐建立两个聚合组:
聚合组 1: [cal_dt, city, pay_type]
聚合组 2: [cal_dt, city, buyer_id]

在不考虑其他干扰因素的情况下,这样的聚合组将节省不必要的 3 个 Cuboid(参考上图): [pay_type, buyer_id]、[city, pay_type, buyer_id] 和 [cal_dt, pay_type, buyer_id],节省了存储资源和构建的执行时间。

Case 1:

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

将从 Cuboid [cal_dt, city, pay_type] 中获取数据。

Case2:

SELECT cal_dt, city, buy_id, count(*) FROM table GROUP BY cal_dt, city, buyer_id;

将从 Cuboid [cal_dt, city, pay_type] 中获取数据。

Case3:
如果有一条不常用的查询

SELECT pay_type, buyer_id, count(*) FROM table GROUP BY pay_type, buyer_id;

不存在匹配的 Cuboid [pay_type, buyer_id],此时,Apache Kylin 会通过在线计算的方式,从现有的 Cuboid 中计算出最终结果。

联合维度

联合维度适用于固定用来分组查询的维度。

用户有时并不关心维度之间各种细节的组合方式,例如用户的查询语句中仅仅会出现 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。


joint

应用实例

假设创建一个交易数据的 Cube,包含了以下一些维度:交易日期(cal_dt)、交易城市(city),顾客性别(sex_id)和支付类型(pay_type) 等。分析师常用的分析方法为通过按照交易时间、交易地点和顾客性别来聚合,获取不同城市男女顾客间不同的消费偏好。

在上述的实例中,推荐在已有的聚合组中建立一组联合维度:
聚合组:[cal_dt, city, sex_id,pay_type]
联合维度: [cal_dt, city, sex_id]

在不考虑其他干扰因素的情况下,将创建 4 个 Cuboid(参考上图三): [cal_dt, city, sex_id, pay_type]、[cal_dt, city, sex_id]、[pay_type] 和 [*],节省了存储资源和构建的执行时间。

Case 1:

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

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

Case2:
如果有一条不常用的查询

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

不存在匹配的 Cuboid [cal_dt, city]。此时,Apache Kylin 会通过在线计算的方式,从现有的 Cuboid 中计算出最终结果。

层级维度

层级维适用于维度间有一对多关系的场景,比如国家/省/城市,产品大类/产品子类等

用户选择的维度中常常会出现具有层级关系的维度。例如对于国家(country)、省份(province)和城市(city)这三个维度,从上而下来说国家/省份/城市之间分别是一对多的关系。也就是说,用户对于这三个维度的查询可以归类为以下三类:

  • group by country
  • group by country, province(等同于 group by province)
  • group by country, province, city(等同于 group by city)

基于ABCD四个维度的场景,假设维度 A 代表国家,维度 B 代表省份,维度 C 代表城市,那么ABC 三个维度可以被设置为层级维度,生成的Cube 如图所示,Cuboid 数目从 16 减小到 8。


hierarchy

Cuboid [A,C,D]=Cuboid[A, B, C, D],Cuboid[B, D]=Cuboid[A, B, D],因而 Cuboid[A, C, D] 和 Cuboid[B, D] 就不必重复存储。

应用实例

假设创建一个交易数据的 Cube,包含了以下一些维度:交易城市(city),交易省(province),交易国家(country)和支付类型(pay_type)等。分析师可以通过按照交易城市、交易省份、交易国家和支付类型来聚合,获取不同层级的地理位置消费者的支付偏好。

在上述的实例中,建议在已有的聚合组中建立一组层级维度(国家country/省province/城市city),包含的维度和组合方式:
聚合组:[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] 中获取数据。

必要维度

必要维度适用于某些维度被高频使用的情景下

用户有时会对某一个或几个维度特别感兴趣,所有的查询请求中都存在 group by 这个维度,那么这个维度就被称为必要维度,只有包含此维度的 Cuboid 会被生成。假设维度A是必要维度,那么生成的 Cube 如图所示,维度数目从16变为9。


mandatory

应用实例

假设创建一个交易数据的 Cube,包含了以下一些维度:交易时间(order_dt)、交易地点(location)、交易商品(product)和支付类型(pay_type)等。其中,交易时间就是一个被高频作为分组条件(group by)的维度。 如果将交易时间 order_dt 设置为必要维度,只有带有 order_dt 的 Cuboid 会被创建


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容