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:本文屬於本身學習和實踐過程的記錄,不少圖和文字都粘貼自網上文章,沒有註明引用請包涵!若有任何問題請留言或郵件通知,我會及時回覆。

相關文章
相關標籤/搜索