kylin实战(一)

kylin适用场景

  • OLAP
  • 它适合数据量大,查询维度多,可是业务改动不频繁的场景。由于业务多,则kylin的cube不少。每次业务变动,kylin修改的工做量大,且每次全量跑数据耗费时间比较长。
  • 它是采用空间换时间,预先将结果计算出来。维度较多时,数据膨胀很快。
  • 若是查询结果能够直接命中,则查询速度很快;若是cube未覆盖,则查询很慢。

若是业务频繁迭代,初期能够考虑用mysql来支撑,等业务比较稳定之后,经过kylin来优化查询速度。mysql

关键概念

  1. 维度:维度是观察数据的角度。例如:销售日期、销售地点。计算机一点的描述就是在SQL中就是where、group by里的字段。
  2. 度量(指标):度量是具体考察的聚合数量值,例如:销售数量、销售金额、人均购买量。计算机一点描述就是在SQL中就是聚合函数sql

    –COUNT:统计行数量
    
    –SUM:获取单个列的合计值
    
    –AVG:计算某个列的平均值
    
    –MAX:计算列的最大值
    
    –MIN:计算列的最小值
    
    group by 关键字表示要进行分类聚合的字段,好比要按照班级分类进行学生人数统计,班级就应该放在group by 的后面。
  3. Aggregation Groups函数

    维度聚合组:给维度分组,属于不一样组的维度不会组合(各组内部才能随意组合,组和组之间不组合)。学习

    主要做用:减小维度组合优化

    include:组里的全部维度字段。ui

    A、 联合维度Joint Dimensions:简单说:全部查询维度的集合>=联合维度。联合维度视为一个维度。适用于:多个维度都是查询条件,如group by outid,day,则outid、day做为联合维度。考虑查询条件中的非动态拼接的sql,若是有where、group by有多个维度,能够考虑设为联合维度。code

    有效剪枝。跨联合的查询会把多个联合维度查询出来,再合并。(根据查询业务分组,就能有效剪枝,而且没有关联多个的查询,从而效率高)。orm

    B、 必要维度Mandatory Dimensions:简单说:全部查询维度的集合>必要维度。join条件、查询必须带上的条件,做为必要维度。(多个必要维度时,生成的维度组合多是不包括必要维度组合自己的。在查询中出现了按照必要维度查询不了的状况【这里多是kylin的一个bug,必要维度组合自己不产生维度,可是sql解析的时候认为产生了因此会匹配成功,而后报错,而且挡住了其余可能支持这个查询的cube的匹配】)多个必要维度能够用联合维度代替。若是维度组(聚合组)的维度包含必要维度全部列,则查询必要维度就能够进行,由于能够经过必要维度和其余维度组合后的结果来汇总必要维度的查询结果。ip

    C、 派生维度derived:把维度表的多个维度字段,不用看成维度构建;而是经过维度表的主键来查询,而后再经过维度表去找到维度。当维度表主键和维度字段不是一对一的时候,还须要二次聚合。这个能剪枝,可是影响查询效率。string

    派生维度是针对维度表的,若是某张维度表有多个维度,若是该维度表一个或者多个列和维度表的主键是一一对应的,则能够将这些维度设置为派生维度。这样在Kylin内部会将其统一用维度表的主键来替换,以下降维度组合的数目。但查询效率会下降,由于Kylin在使用维度表主键进行聚合后,查询时须要再将主键转换为真正的维度列返回给用户。

    D、 层级维度Hierarchy Dimensions:指一系列具备层级关系的维度组成一个层级维度,设置了层级以后,对Cuboid增长了约束,低Level的维度必定要伴随高Level的维度出现,从而使维度组合大大减小。。好比校区、院系、专业、班级

    高基数维度,在groups中出现次数较多的维度。

  • sql与kylin概念对应关系:
sql kylin
select 语句中的函数中的字段 度量
非select语句中的字段和select语句中的直接使用的字段,如where、group by、 维度

举例:

select classname, sum(consume)
from consummer
where gradelevel = ''
group by classcode;

维度: classname、gradelevel、classcode, 其中classname在某些状况下能够设为派生维度。
度量:consume

普通用法与流程

hive建表与导入数据-->新建model-->根据model新建cube

DDL

  • 建外部表
----edu_grade_filter_r------
DROP TABLE IF EXISTS edu_grade_filter_r;

create external table edu_grade_filter_r 
(id BIGINT, outid string,name string,semester string, course_no string, course_name string, score string, course_natures string,
course_properties string, class_hour string,credit string, exam_natures string, school_code string, grade_level string, 
faculty_code string, major_code string, class_code string, point string, course_properties_new string) 
ROW FORMAT DELIMITED  FIELDS TERMINATED BY ',' STORED AS TEXTFILE location '/jkd/edu_grade_filter_r';

-- load data 适合分区表的状况
-- load data inpath '/jkd/edu_grade/edu_grade_filter_r.txt.txt' into table edu_grade_filter_r;

model

  1. Data Model:表join
  2. Dimensions:必需要选,后面才能在cube中选维度。
  3. Measures:度量

cube

  1. 选维度时,从表通常选normal维度,不选derived派生维度
  2. Aggregation Groups-->include:组里的维度全部字段
  • 若是在多个分组中漏掉了某个维度,将致使维度膨胀,cube占用空间很大。
  1. model-->cube(action:build)-->job(monitor)。

若是构建成功,则job不能再从新跑,须要在cube处disabled,而后再build;若是有修改,则先purge(清除),再从新build。

  1. cube构建成功后,能够经过insight查看sql的结果。
cube操做说明

Drop:丢弃现有cube,条件:无Pending, Running, Error 状态的job.

Edit:编辑现有cube,条件:cube需处于disable状态。

Refresh:重建某已有时间段数据,针对于已build时间段的源数据发生了改变的状况。

Merge:手动触发merge操做。

Enable:使拥有至少一个有效segment的cube从disable变为enable状态。

Purge:清空全部该cube的数据。

Clone:克隆一个新的cube,可设置新的名字,其余相关配置与原cube相同。

Disable:使一个处于ready状态的cube变为Disable状态,查询不会从disable的cube中获取数据。

参考文献

  • Apache Kylin 权威指南

tips:本文属于本身学习和实践过程的记录,不少图和文字都粘贴自网上文章,没有注明引用请包涵!若有任何问题请留言或邮件通知,我会及时回复。

相关文章
相关标签/搜索