赞
踩
上一章中讲了怎么创建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中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。