当前位置:   article > 正文

Kylin源码解析——Cube构建过程中如何实现降维_kylin如何剔除一些不必要的维度

kylin如何剔除一些不必要的维度

-维度简述

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

@JsonProperty("rowkey")
private RowKeyDesc rowkey;

@JsonProperty("aggregation_groups")
private List<AggregationGroup> aggregationGroups;
  • 1
  • 2
  • 3
  • 4
  • 5

其中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
        },
    ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

而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;
  • 1
  • 2
  • 3
  • 4
  • 5

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/697583
推荐阅读
相关标签
  

闽ICP备14008679号