当前位置:   article > 正文

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

第3关:将 select 查询结果插入 hive 表中

为了完成本关任务,你需要掌握:1. 单表插入,2. 多表插入。

通过使用查询子句从其他表中获得查询结果,然后使用INSERT命令把数据插入到Hive新表中(Hive会根据MapReduce中的reduce任务个数在HDFS上的hive新表目录下创建相应的数据文件000000_0,若有多个reduce任务,依次以000001_0000002_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表中:

  1. hive> insert overwrite table items_info2
  2. > partition(p_category='clothes',p_brand='playboy')
  3. > select * from items_info ii
  4. > where ii.categroy
  • 单表插入语法( 追加 方式)

    INSERT INTO TABLE tablename [PARTITION (partcol1=val1,partcol2=val2,……) ] SELECT select_statement FROM from_statement;

    该方法以追加的方式把SELECT子句返回的结果添加到表或分区中。

多表插入

  1. FROM from_statement
  2. INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1,partcol2=val2…) [IF NOT EXISTS]] SELECT select_statement1
  3. [INSERT OVERWRITE TABLE tablename2 [PARTITION … [IF NOT EXISTS]] SELECT select_statement2]
  4. [INSERT INTO TABLE tablename2 [PARTITION … ] SELECT select_statement2]…;

多表插入操作的开始第一条命令指定所有表执行的SELECT命令所对应的FROM 子句,针对同一个表,既可以执行INSERT OVERWRITE操作,也可以执行 INSERT INTO操作(如表tablename2)。

多表插入操作可以降低源表的扫描次数,Hive可以通过仅扫描一次数据源表,然后针对不同的Hive表应用不同的查询规则从扫描结果中获取目标数据插入到不同的Hive表中。

如把从items_info中扫描的结果根据不同的查询规则插入到表的不同分区中:

  1. hive> FROM items_info ii
  2. > INSERT INTO TABLE items_info2
  3. > PARTITION (p_category='clothes',p_brand='playboy')
  4. > SELECT * WHERE ii.category='clothes' AND ii.brand='playboy'
  5. > INSERT OVERWRITE TABLE items_info2
  6. > PARTITION (p_category='shoes',p_brand='playboy')
  7. > SELECT * WHERE ii.category='shoes' AND ii.brand='playboy'

编程要求

test3数据库中有student表,表中数据如下:

Snonameagesexscore(Chinese-Math-English)
001Xiaohong18female96-88-90.5
002Xiaoliang17male95-88-93.5
003Xiaoming19male86.5-98-91
004Xiaoguang18male88-80-94
005Xiaohua16female97-58.5-88
  • 复制student表两份,分别名为:student2student3 (只复制表结构不复制数据,可参考:Hive表DDL操作(一)第二关

  • 以覆盖插入的方式把student表中前两条数据插入到student2

  • 以追加插入的方式把student表中前两条数据插入到student2

  • 以覆盖插入的方式把student表中年龄大于17岁的数据插入到student2student3

  • 以追加插入的方式把student表中的男生数据插入到student2,以覆盖插入的方式把女生数据插入到student3

  1. --Begin
  2. --使用test3数据库
  3. use test3;
  4. --复制student表两份,分别名为:student2、student3
  5. create table if not exists student2
  6. like student;
  7. create table if not exists student3
  8. like student;
  9. --以覆盖插入的方式把student表中前两条数据插入到student2
  10. insert overwrite table student2
  11. select * from student limit 2;
  12. --评测代码,勿删
  13. select * from student2;
  14. --以追加插入的方式把student表中前两条数据插入到student2
  15. insert into table student2
  16. select * from student limit 2;
  17. --评测代码,勿删
  18. select * from student2;
  19. --以覆盖插入的方式把student表中年龄大于17岁的数据插入到student2、student3
  20. from student
  21. insert overwrite table student2
  22. select * where student.age > 17
  23. insert overwrite table student3
  24. select * where student.age > 17;
  25. --评测代码,勿删
  26. select * from student2;
  27. select * from student3;
  28. --以追加插入的方式把student表中的男生数据插入到student2,以覆盖插入的方式把女生数据插入到student3
  29. from student
  30. insert into table student2
  31. select * where student.sex = 'male'
  32. insert overwrite table student3
  33. select * where student.sex = 'female';
  34. --评测代码,勿删
  35. select * from student2;
  36. select * from student3;
  37. --End
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/909747
推荐阅读
相关标签
  

闽ICP备14008679号