第3关:将 select 查询结果插入 hive 表中
任务描述
本关任务:根据编程要求将
select
查询结果插入
hive
表中。
相关知识
为了完成本关任务,你需要掌握:1. 单表插入,2. 多表插入。
通过使用查询子句从其他表中获得查询结果,然后使用
INSERT
命令把数据插入到
Hive
新表中(
Hive
会根据
MapReduce
中的
reduce
任务个数在
HDFS
上的
hive
新表目录下创建相应的数据文件
000000_0
,若有多个
reduce
任务,依次以
000001_0
、
000002_0
、…… 类推)。
该操作包括表单插入(一次性向一个
hive
表插入数据)和多表插入(一次性向多个
hive
表插入数据)。
INSERT
命令可以操作在表和特定的分区上,如果属于分区表,必须指明所有分区列和其对应的分区列属性值。
单表插入
- 单表插入语法:
INSERT OVERWRITE TABLE tablename [PARTITION (partcol1=val1,partcol2=val2,……) [IF NOT EXISTS]] SELECT select_statement FROM from_statement;
该方法会 覆盖 表或分区中的数据(若对特定分区指定IF NOT EXISTS
将不执行覆盖操作)。如查询items_info
表,把查询结果放到items_info2
表中:hive> insert overwrite table items_info2> partition(p_category='clothes',p_brand='playboy')> select * from items_info ii> where ii.categroy
- 单表插入语法( 追加 方式)
INSERT INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2,……) ] SELECT select_statement FROM from_statement;
该方法以追加的方式把SELECT
子句返回的结果添加到表或分区中。
多表插入
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1,partcol2=val2…) [IF NOT EXISTS]] SELECT select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION … [IF NOT EXISTS]] SELECT select_statement2]
[INSERT INTO TABLE tablename2 [PARTITION … ] SELECT select_statement2]…;
多表插入操作的开始第一条命令指定所有表执行的
SELECT
命令所对应的
FROM
子句,针对同一个表,既可以执行
INSERT OVERWRITE
操作,也可以执行
INSERT INTO
操作(如表
tablename2
)。
多表插入操作可以降低源表的扫描次数,
Hive
可以通过仅扫描一次数据源表,然后针对不同的
Hive
表应用不同的查询规则从扫描结果中获取目标数据插入到不同的
Hive
表中。
如把从
items_info
中扫描的结果根据不同的查询规则插入到表的不同分区中:
hive> FROM items_info ii
> INSERT INTO TABLE items_info2
> PARTITION (p_category='clothes',p_brand='playboy')
> SELECT * WHERE ii.category='clothes' AND ii.brand='playboy'
> INSERT OVERWRITE TABLE items_info2
> PARTITION (p_category='shoes',p_brand='playboy')
> SELECT * WHERE ii.category='shoes' AND ii.brand='playboy'
编程要求
在
test3
数据库中有
student
表,表中数据如下:
Snonameagesexscore(Chinese-Math-English)
001
Xiaohong
18
female
96-88-90.5
002
Xiaoliang
17
male
95-88-93.5
003
Xiaoming
19
male
86.5-98-91
004
Xiaoguang
18
male
88-80-94
005
Xiaohua
16
female
97-58.5-88
- 复制
student
表两份,分别名为:student2
、student3
(只复制表结构不复制数据,可参考:Hive表DDL操作(一)第二关) - 以覆盖插入的方式把
student
表中前两条数据插入到student2
中 - 以追加插入的方式把
student
表中前两条数据插入到student2
中 - 以覆盖插入的方式把
student
表中年龄大于17岁的数据插入到student2
、student3
中 - 以追加插入的方式把
student
表中的男生数据插入到student2
,以覆盖插入的方式把女生数据插入到student3
中
注意:由于hive启动时间较长,测评时请耐心等待,大概需要时间:1分钟左右。
测试说明
平台会对你编写的命令进行测试:
若操作成功,会显示如下信息:
2 Xiaoliang 17 male {"chinese":95.0,"math":88.0,"english":93.5}
1 Xiaohong 18 female {"chinese":96.0,"math":88.0,"english":90.5}
2 Xiaoliang 17 male {"chinese":95.0,"math":88.0,"english":93.5}
1 Xiaohong 18 female {"chinese":96.0,"math":88.0,"english":90.5}
2 Xiaoliang 17 male {"chinese":95.0,"math":88.0,"english":93.5}
1 Xiaohong 18 female {"chinese":96.0,"math":88.0,"english":90.5}
1 Xiaohong 18 female {"chinese":96.0,"math":88.0,"english":90.5}
3 Xiaoming 19 male {"chinese":86.5,"math":98.0,"english":91.0}
4 Xiaoguang 18 male {"chinese":88.0,"math":80.0,"english":94.0}
1 Xiaohong 18 female {"chinese":96.0,"math":88.0,"english":90.5}
3 Xiaoming 19 male {"chinese":86.5,"math":98.0,"english":91.0}
4 Xiaoguang 18 male {"chinese":88.0,"math":80.0,"english":94.0}
1 Xiaohong 18 female {"chinese":96.0,"math":88.0,"english":90.5}
3 Xiaoming 19 male {"chinese":86.5,"math":98.0,"english":91.0}
4 Xiaoguang 18 male {"chinese":88.0,"math":80.0,"english":94.0}
2 Xiaoliang 17 male {"chinese":95.0,"math":88.0,"english":93.5}
3 Xiaoming 19 male {"chinese":86.5,"math":98.0,"english":91.0}
4 Xiaoguang 18 male {"chinese":88.0,"math":80.0,"english":94.0}
1 Xiaohong 18 female {"chinese":96.0,"math":88.0,"english":90.5}
5 Xiaohua 16 female {"chinese":97.0,"math":58.5,"english":88.0}
说明:
1-2
行返回的是以覆盖插入的方式把student
表中前两条数据插入到student2
中的结果3-6
行返回的是以追加插入的方式把student
表中前两条数据插入到student2
中的结果7-12
行返回的是以覆盖插入的方式把student
表中年龄大于17
岁的数据插入到student2
、student3
中的结果13-20
行返回的是以追加插入的方式把student
表中的男生数据插入到student2
,以覆盖插入的方式把女生数据插入到student3
中的结果
开始你的任务吧!祝你成功。
--Begin
--使用test3数据库
use test3;
--复制student表两份,分别名为:student2、student3
create table if not exists student2
like student;
create table if not exists student3
like student;
--以覆盖插入的方式把student表中前两条数据插入到student2中
insert overwrite table student2
select * from student limit 2;
--评测代码,勿删
select * from student2;
--以追加插入的方式把student表中前两条数据插入到student2中
insert into table student2
select * from student limit 2;
--评测代码,勿删
select * from student2;
--以覆盖插入的方式把student表中年龄大于17岁的数据插入到student2、student3中
from student
insert overwrite table student2
select * where student.age > 17
insert overwrite table student3
select * where student.age > 17;
--评测代码,勿删
select * from student2;
select * from student3;
--以追加插入的方式把student表中的男生数据插入到student2,以覆盖插入的方式把女生数据插入到student3中
from student
insert into table student2
select * where student.sex = 'male'
insert overwrite table student3
select * where student.sex = 'female';
--评测代码,勿删
select * from student2;
select * from student3;
--End
版权归原作者 真题OK撒 所有, 如有侵权,请联系我们删除。