Hive 分区和分桶总结

目录

分区和分桶总结

1、分区

1、分区介绍

2、分区表的操作

3、动态分区

2、分桶表

1、分桶表介绍

2、分桶表的操作

3、分区表和分桶表的区别

参考

分区和分桶总结

1、分区

1、分区介绍

由于数据量过于庞大,使用分区,可以并行的进行处理数据,有点类似于Hadoop当中的切片操作,将数据分开,然后并行去处理,避免去全表扫描。

分区表在生产环境当中用的非常多。分区表实际上就是对应一个在HDFS(或者是其他分布式文件系统)文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件,Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过where子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。

并且,分区的指定的列其实是伪列,意思是不是真是存在的列。

2、分区表的操作

       具体代码如下:

--建表语句
create table temp_table (
id string comment 'ID',
name string comment '姓名'
)comment '临时表'
partitioned by (day string);

--导入数据语句
load data local path 'x' overwrite into table temp_table partition(day='2021-05-01');

--增加分区
alter table temp_table add partition(day='2021-05-02') partition(day='2021-05-03');

--删除分区
alter table temp_table drop partition(day='2021-05-02'),partition(day='2021-05-03');

--查看分区
show partitions temp_table;

       重点需要注意的是partitioned后面的ed,并且,分区字段是不存在列里面的,是一个独立的字段。查询的时候就当作是一个列来进行查询即可。二级分区和一级分区同理,就不重复写了。

load不指定分区的时候,将会放入一个默认的文件夹当中,有时候也会报错,一般需要指定分区。

3、动态分区

不指定固定的分区,而是,根据查询得到的分区字段去进行分区。是按照查询的最后一个字段来作为分区字段,在配置为严格模式下,不能进行动态分区,需要更改配置(Hive版本3之后可以省略partition,默认以最后的字段为分区字段)。代码如下:

insert table temp_table partition(day)
select name, day from temp_table;

--配置的信息是
hive.exec.dynamic.partition.mode=nonstrict

2、分桶表

1、分桶表介绍

分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可以形成合理的分区。对于一张表或者分区,Hive可以进一步组织成桶,也就是更为细粒度的数据范围划分。

分桶是将数据集分解成更容易管理的若干部分的另一个技术。一般用于数据集极大的情况,进行抽样查询。

分区针对的是数据的存储路径,分桶针对的是数据文件。

只能对一列进行分桶。表可以同时分区和分桶,当表分区时,每个分区下都会有 个桶。当使用 SORTED BY … 在桶内排序时,指定排序的列和指定分桶的列无需相同。而且分桶表中插入数据的时候必然要执行一次MAPREDUCE,所以分桶表的数据只能通过从结果集查询插入的方式进行导入。

数据分桶的原理:

按照分桶字段的hash值去模除以分桶的个数。当join连接的字段值取hash不够均匀时,多取一个其它字段作为分桶字段;

bucket num = hash_function(bucketing_column) mod num_buckets

2、分桶表的操作

具体代码如下:

--创建分桶表
create table stu_buck(id int, name string)
clustered by (id)   --注意必须要用存在的列
into 4 buckets  --指定桶的个数
row format delimited fields terminated by '\t';

注意:

hive.enforce.bucketing为true时,reduce要设为-1;

hive.enforce.bucketing为false时,reduce要设为和分桶数一致;

如果bucketing为 true,reduce又设成大于1的输,会执行两个job。

3、分区表和分桶表的区别

分区和分桶最大的区别就是分桶随机分割数据库,分区是非随机分割数据库。

因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。其次两者的另一个区别就是分桶是对应不同的文件(细粒度),分区是对应不同的文件夹(粗粒度)。

当然,分区和分桶可以一起使用。

参考

https://www.bilibili.com/video/BV1EZ4y1G7iL?p=66

https://www.freesion.com/article/23851409747/

 

你可能感兴趣的:(大数据,hive)