hive:动态分区与静态分区
hive在建表的时候可以建分区表
分区主要用于提高性能
分区列的值将表划分为一个个的文件夹
查询时语法使用"分区"列和常规列类似
查询时Hive会只从指定分区查询数据,提高查询效率
分区又分为动态分区和静态分区
首先,我们建一个普通的外部表,导入一个拥有4列字段的文件数据,我们拿这一个表来演示动态分区和静态分区
create external table obs_users(
userid string,
username string,
birthday string,
sex string
)
row format delimited fields terminated by ‘,’
location ‘/wh’;
展示一下数据:
静态分区
下面来建一个分区表:
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;
可以看到:
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;
这里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”,这就是动态分区。
动态分区在大数据中一般用于全量表操作