赞
踩
为了完成本关任务,你需要掌握: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
中
- --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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。