0


HIVE表 DML 操作——第3关:将 select 查询结果插入 hive 表中

第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表两份,分别名为:student2student3 (只复制表结构不复制数据,可参考:Hive表DDL操作(一)第二关)
  • 以覆盖插入的方式把student表中前两条数据插入到student2
  • 以追加插入的方式把student表中前两条数据插入到student2
  • 以覆盖插入的方式把student表中年龄大于17岁的数据插入到student2student3
  • 以追加插入的方式把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岁的数据插入到student2student3中的结果
  • 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
标签: hive hadoop 大数据

本文转载自: https://blog.csdn.net/qq_51916951/article/details/127544645
版权归原作者 真题OK撒 所有, 如有侵权,请联系我们删除。

“HIVE表 DML 操作——第3关:将 select 查询结果插入 hive 表中”的评论:

还没有评论