欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hive:动态分区与静态分区

程序员文章站 2022-07-13 14:12:33
...

hive在建表的时候可以建分区表

分区主要用于提高性能
分区列的值将表划分为一个个的文件夹
查询时语法使用"分区"列和常规列类似
查询时Hive会只从指定分区查询数据,提高查询效率

分区又分为动态分区和静态分区

首先,我们建一个普通的外部表,导入一个拥有4列字段的文件数据,我们拿这一个表来演示动态分区和静态分区

create external table obs_users(
userid string,
username string,
birthday string,
sex string
)
row format delimited fields terminated by ‘,’
location ‘/wh’;

展示一下数据:
hive:动态分区与静态分区

静态分区

下面来建一个分区表:

 create table userinfos(
 userid string,
 username string,
 birthday string
 )
 partitioned by (sex string)
 row format delimited fields terminated by ','
 stored as textfile;

**注意:**这里可以只知道userinfos是一个分区表,不能知道是静态分区还是动态分区
可以看到
partitioned by (sex string)
根据sex字段进行分区,也就是根据“male”和“female”分区
但是
create table userinfos(
userid string,
username string,
birthday string
)
这个括号里面并不包含sex字段,这就是分区表:

desc userinfos;
可以看到:
hive:动态分区与静态分区
sex字段存在于userinfos表结构中

此时userinfos还是一个空表,下面我们根据性别分区向其中插入obs_users的数据:

insert into userinfos partition(sex='female') 
select userid,username,birthday from obs_users where sex='female';

这里我们只能选择插入 userid,username,birthday 这三个字段的数据,如果你插入sex字段就会报错,因为这里已经规定了sex字段只能为“female”,这就是所谓静态查询。
所以静态分区适用于大数据中的增量表操作。
select * from userinfos;
hive:动态分区与静态分区
这里userinfos表中的sex字段就只有“female”一种值。
如果想把“male”分区再加进来:

insert into userinfos partition(sex='male') 
select userid,username,birthday from obs_users where sex='male';

动态分区

下面我们来建一个新的分区表:

 create table myusers(
 userid string,
 username string,
 birthday string
 )
 partitioned by (sex string)
 row format delimited fields terminated by ','
 stored as textfile;

可以看到这个表跟userinfos表结构相同,只是改了个名字

在开始动态分区之前,我们首先要用下面的两个语句:
开启动态分区
set hive.exec.dynamic.partition=true;
将模式设置为非严格模式
set hive.exec.dynamic.partition.mode=nonstrict;

然后,还是把obs_users根据sex字段动态分区,导入myusers表:
insert into myusers partition(sex)
select * from obs_users;

这里可以看到,我们没有再把sex字段规定成“male”或“female”,这就是动态分区。

动态分区在大数据中一般用于全量表操作