大數據之Kylin入門——第三章Kylin之cube構建原理

上一章中講了怎麼創建cube,最後演示了一個cube怎麼執行的,這一章來說說kylin到底是怎麼來構建cube的。

點擊我們的cube的最右邊的箭頭,頁面右邊展示了整個cube構建的詳細步驟,查看每個步驟的log,顯示詳細構建過程。

 

 

1.構建中間表。

拿第二章的例子來說,就是構建由員工和部門組成的寬表。日誌如下:

2.將中間表的數據均勻分配到不同的文件。

因爲後面的程序是從中間表讀取並運行mr程序的,如果你的中間表數據不均勻會造成後續的mr程序數據傾斜,降低效率。所以非常有必要將數據均勻分配。

我們來看看kylin到底是怎麼均勻分配的。首先它會計算表中總共有多少行數據(total input rows),然後它默認每個文件1000000行數據(一百萬行數據差不多不會超過hdfs一個塊大小,也就是128M),然後計算有多少個文件(多少個reduce),total input rows/1000000。我們這裏只有1個文件。然後設定reduce任務的個數,用distribute by重新將這些數據分配到不同的文件中。

3.創建維度字典表。

比如job,可能有很多值,去重後,每個值按照0到N,一一映射保存到各個維度表中,這樣做便於以後查詢效率高,下面你就能感受到這種設計的巧妙之處了。

job     value                        hiredate        value                                    dname      value

java      0                            2019-10-01      0                                        partA           0

c++       1                           2019-05-01      1                                         partB          1

python   2

4.多維度構建cube。

我這裏爲了省時就只寫三個維度了,數據量也只寫了4條。*代表無數據,也就是全體的意思,比如第二行表示了2019-05-01入職的C++的所有開發員工的薪水是30000。第三行代表了所有python員工的工資是200000。從一維到多維構建所有的情況,總共有2^n-1種情況,n表示維度。

job            hiredate         dname      sal

java          2019-10-01    partA        10000

c++          2019-05-01        *            30000

python     *                        *            200000

*                    *                partB        70000

5.Hbase K-V映射。

按照步驟3,4一一構建映射。rowkey是由維度id+維度值組成的。比如第一行   java,2019-10-01,partA,10000這條數據,每一維都有數據,所以每一維都記1,就是111,然後對照步驟3,維度值是000,結果就是111000。再舉個例子,比如第二行,c++ ,2019-05-01, * , 30000。只有前面兩維有數據,所以是110,對照步驟3,維度值就是11,結果就是11011(注意,維度值是0就省略掉)。最終步驟4構建如下所示。(爲了方便大家看,rowkey中寫了‘+’,其實是沒有‘+’)現在看看,數據全部都是數字存儲,是不是簡便了很多了。等會查詢的時候你也會發現查詢的效率也很高。

RowKey          value

111+000         10000

110+11           30000

100+2             200000

001+1             70000

6.將cube data轉成HFile格式並導入HBase。

步驟5的結果實際上是以sequence格式保存在hive中,現在將hive中結果導入HBase中。

 

發佈了16 篇原創文章 · 獲贊 3 · 訪問量 1875
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章