hive 分区和分桶

一、为啥分区

hive 为了避免全表查询,从而引进分区,将数据按目录进行划分,减少不必要的查询,从而提高效率

二、hive的分区和mysql分区的区别

mysql的分区字段用的是表内字段,hive的分区字段采用表外字段,也就是使用伪字段,分区字段在创建表的时候指定

分区的关键字:partitioned by(字段)

三、静态分区练习

create table if not exists u1(
id int,
name string,
age int
)
partitioned by(dt string)
row format delimited fields terminated by ' '
stored as textfile
;


1 xm1 16
2 xm2 18
3 xm3 22

11 xh1 26
22 xh2 28
33 xh3 30

load data local inpath '/home/u1' into table u1 partition(dt="2018-10-14");
load data local inpath '/home/u115' into table u1 partition(dt="2018-10-15");

四、二级分区

create table if not exists u2(
id int,
name string,
age int
)
partitioned by(month int,day int)
row format delimited fields terminated by ' '
stored as textfile
;


1 xm1 16
2 xm2 18

3 xm3 22

11 xh1 26

22 xh2 28
33 xh3 30

load data local inpath '/home/u1914' into table u2 partition(month=9,day=14);
load data local inpath '/home/u1915' into table u2 partition(month=9,day=15);
load data local inpath '/home/u11014' into table u2 partition(month=10,day=14);
load data local inpath '/home/u11015' into table u2 partition(month=10,day=15);

hive 分区和分桶_第1张图片

五、hive的修改分区

查询分区:
show partitions u1;

增加分区:
alter table u1 add partition(dt="2018-10-16");
alter table u1 add partition(dt="2018-10-16") partition(dt="2018-10-17"); 
alter table u1 add partition(dt="2018-10-19") location "/user/hive/warehouse/gp1801.db/u1/dt=2018-10-16/";

修改分区(手动修改元数据信息):
alter table u1 partition(dt="2018-10-16") rename to partition(dt="2018-10-26");

修改已存在分区的路径:
alter table u1 partition(dt="2018-10-19") set location "hdfs://qianfeng/user/hive/warehouse/gp1801.db/u1/dt=2018-10-14/";

删除分区:
alter table u1 drop partition(dt="2018-10-27");
alter table u1 drop partition(dt="2018-10-26"),partition(dt="2018-10-19");

六、hive的动态分区

hive.exec.dynamic.partition=true;  是否允许动态分区
hive.exec.dynamic.partition.mode=strict/nostrict; 动态区模式为严格模式
hive.exec.max.dynamic.partitions=1000;  允许最大的动态分区
hive.exec.max.dynamic.partitions.pernode=100; 单个节点允许最大分区

strict:严格模式,最少需要一个静态分区列(指定固定值)
nostrict:费严格模式,允许所有的分区字段都为动态。


hive的静态分区:分区数据已知
hive的动态分区:分区数据未知(不知道有多少个分区)
hive的混合分区:有动态有静态



create table if not exists u3(
id int,
name string,
age int
)
partitioned by(month int,day int)
row format delimited fields terminated by ' '
stored as textfile
;

将u2表中的数据加载到u3中:
from u2
insert into table u3 partition(month,day)
select id,name,age,month,day
;

七、混合分区

create table if not exists u4(
id int,
name string,
age int
)
partitioned by(month int,day int)
row format delimited fields terminated by ' '
stored as textfile
;

from u2
insert into table u4 partition(month=9,day)
select id,name,age,day
where month=9
;

八、hive的分桶

1.为什么分桶

提高数据的细粒度,将之前的单个文件变成多个文件

作用:

1、对数据进行抽样查询,较为高效。

2、可以使查询效率提高

2.分桶技术

分桶字段是表内字段,默认是对分桶的字段进行hash值,然后模总的桶数,得到的值则是分区桶数

3.hive分桶的关键字
bucket
clustered by(id) into 4 buckets

4.分桶案例

分4个桶

create table if not exists u5(
id int,
name string,
age int
)
partitioned by(month int,day int)
clustered by(id) into 4 buckets
row format delimited fields terminated by ' '
stored as textfile
;

对分桶的数据不能使用load的方式加载数据,使用load方式加载不会报错,但是没有分桶的效果。
1 xm1 16
2 xm2 18
3 xm3 22
4 xh4 20
5 xh5 22
6 xh6 23
7 xh7 25
8 xh8 28
9 xh9 32
load data local inpath '/home/bu' into table u2 partition(month=9,day=10);

为分桶表加数据,使用insert:
需要设置,否则不能分桶
set hive.enforce.bucketing=true;  
from u2
insert into table u6 partition(month=9,day=10)
select id,name,age
where month = 9
and day = 10
;

九、分桶的注意

对分桶进行查询 tablesample(bucket x out of y on id):
x:表示从哪个桶开始查询
y:表示桶的总数,一般为桶的总数的倍数或者因子。
x不能大于y。
如果y不是桶的总数的倍数或者因子,则会重新分桶查找数据


select * from u6 tablesample(bucket 1 out of 4 on id);

select * from u6 tablesample(bucket 2 out of 4 on id);

select * from u6 tablesample(bucket 1 out of 2 on id); 1 1+4/2=3 3+4/2=5 

select * from u6 tablesample(bucket 1 out of 8 on id) where age > 22;


随机查询:
select * from u6 order by rand() limit 3;

select * from u6 tablesample(3 rows);

select * from u6 tablesample(30 percent);

select * from u6 tablesample(3G); B、k、M、G
select * from u6 tablesample(3K);

注意:
分区使用表外的字段,分桶使用表内字段
分区可以使用load加载数据,而分桶就必须要使用insert into方式加载数据
分区常用;分桶少用

 

你可能感兴趣的:(hive)