Kylin源码解析——Cube构建过程中如何实现降维

本文详细介绍了Apache Kylin在构建Cube过程中如何实现降维,包括Cube的描述类CubeDesc的rowkey和aggregationGroups字段,以及维度的分组原理。通过分析维度的组合和有效性判断,探讨了降维逻辑,特别是普通维度、层级维度和联合维度的处理方式。此外,还提及了升维操作和父Cuboid的获取策略。
摘要由CSDN通过智能技术生成

-维度简述

Kylin中Cube的描述类CubeDesc有两个字段,rowkey和aggregationGroups。

@JsonProperty("rowkey")
private RowKeyDesc rowkey;

@JsonProperty("aggregation_groups")
private List<AggregationGroup> aggregationGroups;

其中rowkey描述的是该Cube中所有维度,在将统计结果存储到HBase中,各维度在rowkey中的排序情况,如下是rowkey的一个样例,包含6个维度。在描述一种维度组合时,是通过二进制来表示。
如这6个维度,都包含时,是 111111。
如 111001,则表示只包含INSERT_DATE、VISIT_MONTH、VISIT_QUARTER、IS_CLICK这四个维度。
二进制从左到右表示的就是rowkey_columns中各个维度的包含与否,1包含,0不包含。
这样的一个二进制组合就是一个cuboid,用long整型表示。

"rowkey": {
    "rowkey_columns": [
        {
            "column": "DW_OLAP_CPARAM_INFO_VERSION2.INSERT_DATE",
            "encoding": "dict",
            "isShardBy": false
        },
        {
            "column": "DW_OLAP_CPARAM_INFO_VERSION2.VISIT_MONTH",
            "encoding": "dict",
            "isShardBy": false
        },
        {
            "column": "DW_OLAP_CPARAM_INFO_VERSION2.VISIT_QUARTER",
            "encoding": "dict",
            "isShardBy": false
        },
        {
            "column": "DW_OLAP_CPARAM_INFO_VERSION2.BUSINESS_TYPE",
            "encoding": "dict",
            "isShardBy": false
        },

        {
            "column": "DW_OLAP_CPARAM_INFO_VERSION2.SHOP_TYPE",
            "encoding": "dict",
            "isShardBy": false
        },
        {
            "column": "DW_OLAP_CPARAM_INFO_VERSION2.IS_CLICK",
            "encoding": "dict",
            "isShardBy": false
        },
    ]
}

而aggregationGroups则描述的是这些维度的分组情况,也就是在一个Cube中的所有维度,可以分成多个分组,每个分组就是一个AggregationGroup,各AggregationGroup之间是相互独立的。

对于所有的维度为什么要做分组?

在Kylin中会预先把所有维度的各种组合下的统计结果原先计算出来,假设维度有N个,那么维度的组合就有2^N中组合,比如N=6,则总的维度组合就有2^6=64种。

如果能够根据实际查询的需求,发现某些维度之间是不会有交叉查询的,那其实把这些维度组合的统计结果计算出来,也是浪费,因为后续的查询中,压根不会用到,这样既浪费了计算资源,更浪费了存储资源,所有可以按实际的查询需求,将维度进行分组,比如6个维度,分成2组,一组4个维度,一组2个维度,则总的维度组合则是2^4+2^2=20,比64小了很多,这里的分组这是举例说明分组,可以有效的减少维度组合,从而缩减存储空间,另外各个分组之间是可以有共享维度的,比如6个维度,可以分成两组,一组4个,另一组3个,两个分组中的共享维度,在后续计算中,其对应的统计结果不会被计算两次,只会计算一次,这也是Kylin聪明的地方。

一个AggragationGroup中包含includes和selectRule两个字段,其中includes就是该分组中包含了哪些维度,是一个字符串数组。

@JsonProperty("includes")
private String[] includes;

@JsonProperty("select_rule")
private SelectRule selectRule;

AggregationGroup详见 https://mp.weixin.qq.com/s?__biz=MzAwODE3ODU5MA==&mid=2653077921&idx=1&sn=89ae88bc63e71098166b74df7106c7bf&chksm=80a4bf50b7d3364692903aac3e901d09a516a8ff635e690e1e22b1d96abb4b2925c98cdace82&scene=21#wechat_redirect

强制维度——在每一个维度组合中都必须出现的维度,详见 https://mp.weixin.qq.com/s?__biz=MzAwODE3ODU5MA==&mid=2653077943&idx=1&sn=007d2ba345d0e25ec12807aa47f9913d&chksm=80a4bf46b7d33650465d33e20dac7edc09a7ad9308d77de6a501685c8ae00cba661c1d612074&scene=21#wechat_redirect

层级维度——则是那些有层级关系的维度,如省、市、县,详见 https://mp.weixin.qq.com/s?__biz=MzAwODE3ODU5MA==&mid=2653077929&idx=1&sn=c76ed1fbb745945a077d9ca99f159a4d&chksm=80a4bf58b7d3364e0346ad9c433d4e32c57d45f41b361ae653c64c7fcebab21238793d2f66cb&scene=21#wechat_redirect

联合维度——则是那些要么不出现,要出现就必须一起出现的维度,详见 https://mp.weixin.qq.com/s?__biz=MzAwODE3ODU5MA==&mid=2653077926&idx=1&sn=a0037628bd102ec8e607d67204cbfa7c&chksm=80a4bf57b7d336419896c9e801a51f08ead2f7727d0d0ec0f9e3b7799ae3c302ebea54f93cc0&a

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值