第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
表,表中数据如下:
Sno | name | age | sex | score(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}
说明:文章来源:https://www.toymoban.com/news/detail-431780.html
-
1-2
行返回的是以覆盖插入的方式把student
表中前两条数据插入到student2
中的结果 -
3-6
行返回的是以追加插入的方式把student
表中前两条数据插入到student2
中的结果 -
7-12
行返回的是以覆盖插入的方式把student
表中年龄大于17
岁的数据插入到student2
、student3
中的结果 -
13-20
行返回的是以追加插入的方式把student
表中的男生数据插入到student2
,以覆盖插入的方式把女生数据插入到student3
中的结果
开始你的任务吧!祝你成功。文章来源地址https://www.toymoban.com/news/detail-431780.html
--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
到了这里,关于HIVE表 DML 操作——第3关:将 select 查询结果插入 hive 表中的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!