大数据之Kylin入门——第三章Kylin之cube构建原理

上一章中讲了怎么创建cube,最后演示了一个cube怎么执行的,这一章来说说kylin到底是怎么来构建cube的。

点击我们的cube的最右边的箭头,页面右边展示了整个cube构建的详细步骤,查看每个步骤的log,显示详细构建过程。

大数据之Kylin入门——第三章Kylin之cube构建原理_第1张图片 

 

1.构建中间表。

拿第二章的例子来说,就是构建由员工和部门组成的宽表。日志如下:

大数据之Kylin入门——第三章Kylin之cube构建原理_第2张图片

2.将中间表的数据均匀分配到不同的文件。

因为后面的程序是从中间表读取并运行mr程序的,如果你的中间表数据不均匀会造成后续的mr程序数据倾斜,降低效率。所以非常有必要将数据均匀分配。

大数据之Kylin入门——第三章Kylin之cube构建原理_第3张图片

我们来看看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中。

 

你可能感兴趣的:(Kylin)