【hive】- 使用insert into insert overwrite插入数据到静态分区、动态分区 ...

打印 上一主题 下一主题

主题 840|帖子 840|积分 2520

  1. ### 静态分区插入数据
  2. * insert into,在city\_code=‘200’,cur\_day='20231111’分区下追加数据。
复制代码
insert into table test_1
partition(city_code=‘200’,cur_day=‘20231111’)
select
t.id,
t.name,
t.classes,
t.scores
from test_1_tmp t where city_code=‘200’
;
  1. * insert overwrite,删除在city\_code=‘200’,cur\_day='20231111’分区下数据,重新写入数据。
复制代码
insert overwrite table test_1
partition(city_code=‘200’,cur_day=‘20231111’)
select
t.id,
t.name,
t.classes,
t.scores
from test_1_tmp t where city_code=‘200’
;
  1. ### 动态分区插入数据
  2. * insert into / insert overwrite
复制代码
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert into table test_1
partition(city_code,cur_day)
select
t.id,
t.name,
t.classes,
t.scores,
t.city_code,
t.cur_day
from test_1_tmp t
;
  1. [/code] set hive.exec.dynamic.partition=true;
  2. set hive.exec.dynamic.partition.mode=nonstrict;
  3. insert overwrite table test_1
  4. partition(city_code,cur_day)
  5. select
  6. t.id,
  7. t.name,
  8. t.classes,
  9. t.scores,
  10. t.city_code,
  11. t.cur_day
  12. from test_1_tmp t
  13. ;
  14. [code]
  15. >
  16. > insert into table 插入动态分区,如果被插入表原来就有该分区,则追加插入数据;否则就正常插入数据。  
  17. >  insert overwrite table 插入动态分区,如果被插入表原来就有该分区,删除原来该分区下数据,重新插入;否则就正常插入数据。
  18. >
  19. >
  20. >
  21. **举例:**
  22. 未将test\_2\_tmp数据插入到test\_1时,test\_1表的数据情况:
复制代码
select * from test_1;
  1. ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/cf1c550025ab41f2944313390460fd51.png)
  2. 表test\_2\_tmp的情况:
复制代码
desc test_2_tmp;
±-----------±-----------±---------+
| col_name | data_type | comment |
±-----------±-----------±---------+
| id | string | |
| name | string | |
| classes | string | |
| scores | int | |
| city_code | string | |
| cur_day | string | |
±-----------±-----------±---------+
  1. [/code] select * from test_2_tmp;
  2. [code]
  3. ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4d6024c46985404692f9fb81a4adbe1a.png)
  4. 用insert overwrite table重写写入(city\_code='200’与cur\_day='20231111’分区)和(city\_code='763’与cur\_day='20231112’分区),如下:
复制代码
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table test_1
partition(city_code,cur_day)
select
t.id,
t.name,
t.classes,
t.scores,
t.city_code,
t.cur_day
from test_2_tmp t
;
select * from test_1;
  1. ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6fb8c66a1df144529022ffcd59d3abeb.png)
  2. >
  3. > **注意:**
  4. >
  5. >
  6. >
  7. >
  8. > 1、hive支持全动态分区,但是在使用前必须设置以下参数:  
  9. >  set hive.exec.dynamic.partition=true;  
  10. >  set hive.exec.dynamic.partition.mode=nonstrict;  
  11. >  2、字段和目标表动态分区的对应关系是由字段顺序决定,并不是由列名称决定的。
  12. >
  13. >
  14. >
  15. >
  16. > 3、向动态分区插入数据时,动态分区必须在select列表中,否则会执行失败。
  17. >
  18. >
  19. >
复制代码
insert into table test_1
partition(city_code,cur_day)
select
t.id,
t.name,
t.classes,
t.scores
from test_1_tmp t
;
  1. 报错:
复制代码
Error: Error while compiling statement: FAILED: SemanticException [Error 10044]: Line 1:18 Cannot insert into target table because column number/types are different ‘cur_day’: Table insclause-0 has 6 columns, but query has 4 columns. (state=42000,code=10044)
  1. ### 动静混合分区插入数据
  2. * insert into / insert overwrite
复制代码
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=strict;
insert into table test_1
partition(city_code=‘763’,cur_day)
select
t.id,
t.name,
t.classes,
t.scores,
t.cur_day
from test_1_tmp t
;
  1. [/code] set hive.exec.dynamic.partition=true;
  2. set hive.exec.dynamic.partition.mode=strict;
  3. insert overwrite table test_1
  4. partition(city_code=‘763’,cur_day)
  5. select
  6. t.id,
  7. t.name,
  8. t.classes,
  9. t.scores,
  10. t.cur_day
  11. from test_1_tmp t
  12. ;
  13. [code]
  14. >
  15. > insert into table 插入动静混合分区,如果被插入表原来就有该分区,则追加插入数据;否则就正常插入数据。  
  16. >  insert overwrite table 插入动静混合分区,如果被插入表原来就有该分区,删除原来该分区下数据,重新插入;否则就正常插入数据。
  17. >
  18. >
  19. >
  20. **举例:**
  21. 未将test\_2\_tmp数据插入到test\_1时,test\_1表的数据情况:
复制代码
select * from test_1;
  1. ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/cf1c550025ab41f2944313390460fd51.png)
  2. 表test\_2\_tmp的情况:
复制代码
select * from test_2_tmp;
  1. ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4d6024c46985404692f9fb81a4adbe1a.png)
  2. 用insert into追加插入(city\_code=‘763’,cur\_day)分区的情况,如下:
复制代码
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=strict;
insert into table test_1
partition(city_code=‘763’,cur_day)
select
t.id,
t.name,
t.classes,
t.scores,
t.cur_day
from test_2_tmp t
;
  1. ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8771bb4e46cc498aaa3e2602a0bb8553.png)
  2. 用insert overwrite重写(city\_code=‘763’,cur\_day)分区的情况,如下:
复制代码
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=strict;
insert overwrite table test_1
partition(city_code=‘763’,cur_day)
select
t.id,
t.name,
t.classes,
t.scores,
t.cur_day
from test_2_tmp t
;
  1. ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a9a9e1e5d2f74d6e9622ea6a35b1f1b6.png)
  2. >
  3. > **注意:** 动静态分区混合插入,静态分区要在动态分区前面。
  4. >
  5. >
  6. >
复制代码
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=strict;
insert into table test_1
partition(cur_day,city_code=‘763’)
select
t.id,
t.name,
t.classes,
t.scores,
t.cur_day
from test_1_tmp t
;
  1. 报错:
复制代码
Error: Error while compiling statement: FAILED: ValidationFailureSemanticException summary_fz_province.test_1: Partition spec {city=763, cur_day=null} contains non-partition columns (state=42000,code=40000)
[code][/code]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表