Hive 分区和分桶

分区

Hive分区是指按照数据表的某列或某些列分为多个区,区从形式上能够理解为文件夹,这样能够实现取数据的时候,某个分区取出来的数据就是所须要的分区数据。
经常使用的分区字段有:按时间分区,按业务分区等。ide

#建立分区表
create table t1 (
id int,
name string,
age int
)
partitioned by (pdate string)
row format delimited fields terminated by '\001'
;

经常使用命令:
查看分区数据:
select * from t1 where pdate='2020-01-01';

查看有哪些分区:
show partitions t1;

向分区插入数据:
insert overwrite table t1 partition(pdate='2020-01-01')
select * from xxx
;

分桶

Hive 分桶是比分区更细粒度的数据划分,能够指定分桶表的某一列,让该列数据按照哈希取模的方式随机、均匀地分发到各个桶文件中。
由于分桶操做须要根据某一列具体数据来进行哈希取模操做,故指定的分桶列必须基于表中的某一列(字段)。分桶改变了数据的存储方式,它会把哈希取模相同或者在某一区间的数据行放在同一个桶文件中。code

如此一来即可提升查询效率,好比咱们要对两张在同一列上进行了分桶操做的表进行JOIN操做的时候,只须要对保存相同列值的桶进行JOIN操做便可。同时分桶也能够提升采样率。orm

分桶表的好处:
得到更高的查询处理效率:桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,链接两个在(包含链接列的)相同列上划分了桶的表,可使用 Map 端链接 (Map-side join)高效的实现。好比JOIN操做。对于JOIN操做两个表有一个相同的列,若是对这两个表都进行了桶操做。那么将保存相同列值的桶进行JOIN操做就能够,能够大大较少JOIN的数据量。开发

使取样(sampling)更高效:在处理大规模数据集时,在开发和修改查询的阶段,若是能在数据集的一小部分数据上试运行查询,会带来不少方便。string

#经常使用指令:
#建立分桶表
create table t2(
id int,
name string
)
clustered by (id) sorted by(id) into 4 buckets 
;

查看分桶表:
dfs -ls /user/hive/warehouse/bucketed_users;
文件结构以下所示:
/user/hive/warehouse/b_table1/000000_0
/user/hive/warehouse/b_table1/000001_0
/user/hive/warehouse/b_table1/000002_0
/user/hive/warehouse/b_table1/000003_0it

动态分区表

对动态分区表写入数据时,要开启容许动态分区写入。
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrict;io

相关文章
相关标签/搜索