当前位置: 代码网 > 科技>人工智能>数据分析 > 【hive】- 使用insert into/insert overwrite插入数据到静态分区、动态分区、动静态分区

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

2024年08月02日 数据分析 我要评论
使用insert into/insert overwrite插入数据到静态分区、动态分区、动静态分区


前言

hive中支持的分区类型有两种,静态分区(static partition)与动态分区(dynamic partition),本文主要讲针对不同分区情况,如何正确地使用insert into/insert overwrite 将数据插入表里对应的分区。


一、hive分区

hive分区类型

  • 静态分区与动态分区的区别:
    静态分区字段需要手动指定,通过用户传递来决定;而动态分区字段是根据select出来的具体值进行动态分区。

hive分区参数

  • hive.exec.dynamic.partition:是否启动动态分区,默认为false。
  • hive.exec.dynamic.partition.mode:打开动态分区后,动态分区的模式为strict和nonstrict。
    • strict 可设置为静态和半动态,要求至少包含一个静态分区列。
    • nonstrict 可设置为静态、半动态和动态,动态必须设置此参数。
  • hive.exec.max.dynamic.partitions:允许的最大的动态分区的个数,默认为1000。
  • hive.exec.max.dynamic.partitions.permode:一个mapreduce job所允许的最大的动态分区的个数,默认为100。

二、数据插入方式

建立分区表

create table test_1
(id string,
name string,
classes string,
scores int)
partitioned by (city_code string,cur_day string)
row format delimited fields terminated by ',';

辅助分区表的测试表

create table test_1_tmp(
id string,
name string,
classes string,
scores int,
city_code string,
cur_day string)
row format delimited fields terminated by ','; 

静态分区插入数据

  • 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'
;
  • 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'
;

动态分区插入数据

  • 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
;
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_1_tmp t
;

举例:

未将test_2_tmp数据插入到test_1时,test_1表的数据情况:

select * from test_1;

在这里插入图片描述

表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     |          |
+------------+------------+----------+
select * from test_2_tmp;

在这里插入图片描述

用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;

在这里插入图片描述

insert into table test_1 
partition(city_code,cur_day)
select 
t.id,
t.name,
t.classes,
t.scores
from test_1_tmp t
;

报错:

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)

动静混合分区插入数据

  • 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
;
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_1_tmp t
;

举例:

未将test_2_tmp数据插入到test_1时,test_1表的数据情况:

select * from test_1;

在这里插入图片描述

表test_2_tmp的情况:

select * from test_2_tmp;

在这里插入图片描述

用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
;

在这里插入图片描述

用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
;

在这里插入图片描述

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
;

报错:

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)
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com