Kylin入门实战(数据源添加 + Model定义 + Cube构建 + 结果查询 + 查询限制)

1. 入门实战目的

实现从不同的维度统计员工的工资,例如从岗位类型、员工年龄、部门等不同维度,进行多维度的工资查询

2. Hive源数据准备

创建数据库

0: jdbc:hive2://kylin1:10000> create database kylin_test;
0: jdbc:hive2://kylin1:10000> use kylin_test;

创建员工表和部门表

0: jdbc:hive2://kylin1:10000> create external table if not exists employee(
emp_no int comment '员工ID',
emp_name string comment '员工姓名',
job string comment '岗位名称',
birthday string comment '员工生日',
salary double comment '薪水', 
reward double comment '奖金',
depart_no int comment '部门ID'
) row format delimited fields terminated by '\t';
0: jdbc:hive2://kylin1:10000>
0: jdbc:hive2://kylin1:10000> create external table if not exists department(
depart_no int comment '部门ID',
depart_name string comment '部门名称',
city string comment '城市'
) row format delimited fields terminated by '\t';
0: jdbc:hive2://kylin1:10000>

查看源数据文件

[root@kylin1 ~]# cat employee.txt 
1	emp_name_1	大数据工程师	2000-01-01	13000	400	1
2	emp_name_2	大数据工程师	2000-01-01	13000	400	1
3	emp_name_3	大数据工程师	2000-01-01	13000	400	1
4	emp_name_4	大数据工程师	2000-01-01	13000	400	1
5	emp_name_5	大数据工程师	2000-01-01	13000	400	1
6	emp_name_6	Java工程师	2001-01-01	12000	300	2
7	emp_name_7	Java工程师	2001-01-01	12000	300	2
8	emp_name_8	Java工程师	2001-01-01	12000	300	2
9	emp_name_9	Java工程师	2001-01-01	12000	300	2
10	emp_name_10	Java工程师	2001-01-01	12000	300	2
11	emp_name_11	前端工程师	2002-01-01	11000	200	3
12	emp_name_12	前端工程师	2002-01-01	11000	200	3
13	emp_name_13	前端工程师	2002-01-01	11000	200	3
14	emp_name_14	前端工程师	2002-01-01	11000	200	3
15	emp_name_15	前端工程师	2002-01-01	11000	200	3
16	emp_name_16	产品经理	2003-01-01	10000	100	4
17	emp_name_17	产品经理	2003-01-01	10000	100	4
18	emp_name_18	产品经理	2003-01-01	10000	100	4
19	emp_name_19	产品经理	2003-01-01	10000	100	4
20	emp_name_20	产品经理	2003-01-01	10000	100	4
[root@kylin1 ~]# 
[root@kylin1 ~]# cat department.txt 
1	数据部	北京
2	后端部	北京
3	前端部	上海
4	产品部	上海
[root@kylin1 ~]# 

导入源数据到Hive

0: jdbc:hive2://kylin1:10000> load data local inpath '/root/employee.txt' into table employee;
0: jdbc:hive2://kylin1:10000> load data local inpath '/root/department.txt' into table department;

3. 创建project并添加Hive数据源

创建project
创建project
添加数据源

这里有三种添加kylin数据源的方式:

  • 手动输入想添加的Hive表,格式为:db1.tb1,db2.tb2
  • 从hive数据库表结构中,选择需要添加的数据源
  • 上传CSV文件,并选择第一行是否是表头、每列的分隔符,再输入一个虚拟的数据库和表名,比如:db1.tb1

这里我们选择第二种。将选择的数据源信息元数据同步到mysql

同步Hive表元数据到mysql

4. 定义model

新建model
新建model第一步:定义model信息
model信息
第二步:定义model的表
选择事实表
选择维度表说明:

  • 如果维度表太大,比如大于300MB,则不要对该维度表进行snapshot。导致不能直接查询该维度表,和不能从该维度表定义Cube的衍生维度字段
  • 两个表的join字段类型必须一致

再点击Next,进入下一步

第三步:选择model的维度字段

选择维度字段
第四步:选择model的度量字段
选择度量字段
第五步:model的分区和条件过滤设置

分区和条件过滤设置
由于我们的Hive测试表不是分区表,所以不用定义事实表的分区字段信息,进行的是全量数据构建。生产环境需要定义实时表的分区字段信息,进行增量数据构建。维度表只能进行全量数据构建

最后点击Save进行保存

5. 定义Cube

新建cube
新建cube
第一步:定义cube信息

定义cube信息由于我们部署Kylin的时候,没有配置Email报警,所以这里不用进行设置

第二步:选择cube计算的维度

点击Add Dimensions,然后选择cube计算的维度,再点击OK,再点击Next进入下一步

选择cube计算的维度从model中定义的维度中进行选择,这里选择的维度个数会影响cuboid的个数

这里DEPART_NAME字段定义的维度类型为衍生维度

衍生维度的作用说明:假如我们在维度表选择了DEPART_NAME、CITY这两个维度,维度类型为正常维度,就会产生2的N次方 - 1,共3个维度。但是如果是衍生维度,这两个字段都可以通过DEPART_NO推导出来,则共有1个维度,减少了cuboid的个数

第三步:定义cube的度量计算字段

点击 + Measure,然后定义cube的度量计算字段,再点击OK,再点击Next进入下一步

定义cube的度量计算字段从model中定义的度量字段中进行选择

第四步:动态更新设置,这里保持默认就好了,点击Next进入下一步

动态更新设置这里的自动合并设置,值为7天和28天。含义是:我们每天对cube进行增量构建,每天的segment都会产生一个parquet文件,每过7天合并最近7天的parquet文件成一个小文件,每过28天合并最近的3个小文件和最近7天的parquet文件,合并成一个大文件

第五步:高级设置,这里保持默认就好了,点击Next进入下一步

高级设置Cube的构建Engine默认就是Spark

第六步:配置覆盖,这里保持默认就好了,点击Next进入下一步

配置覆盖
最后点击Save保存就可以了

cube详细信息查看cube详细信息查看可以看到如下信息:

  • Grid:cube定义时,各步骤的信息
  • SQL:查看cube构建时运行的SQL
  • JSON(Cube):生成的json格式的cube元数据信息
  • Owner:cube所属的kylin用户
  • Storage:构建完成后的cube,所占的磁盘信息

6. 构建cube

构建cube
构建cube查看构建状态

查看构建状态

点击小箭头图表,查看构建的详细信息,构建过程总共分两步,可以查看每步的构建日志,第二步还可以跳转到spark application的页面

查看spark的页面,提交application运行完成

application完成

7. 查询cube构建后的结果

输入SQL,查询cube构建后的结果:

查询cube构建后的结果点击Submit之后,会在Spark启动一个一直运行的Spark(Sparder)任务,用于对后续所有的查询提供服务

Sparder

查询的结果如下:

查询结果

8. 查询限制

我们这里没有做查询下压,所以查询有很多限制,如下所示:

  • model构建时,两表关联是inner join,查询的时候只能是inner join,其它类型的join(如left join)会报错
  • 查询时表做join关联,必须事实表在前,维度表在后
  • group by的维度字段,只能是cube定义时选择的字段,和join关联字段,其它字段会报错
  • 聚合计算的值,只能选择cube定义的度量值。比如cube定义了count(1)、sum(salary),则只能计算count、sum(salary)、avg(salary),不能计算max(salary)、sum(reward)等
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值