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可以进一步组织成桶,也就是更为细粒度的数据范围划分。

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

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

只能对一列进行分桶。表可以同时分区和分桶,当表分区时,每个分区下都会有<num_buckets> 个桶。当使用 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分区分桶是在Hive中用于优化查询性能的两种技术。它们都是基于数据的组织和存储方式的不同,适用于不同的场景。 1. 分区Hive分区是将按照某一列或多列的值进行划分,将数据存储到不同的目录中。分区可以基于时间、地区、类别等列,使得查询时只需要扫描特定分区,而不是整个,从而提高查询效率。适用于数据量较大、查询常基于特定列的场景。 举例来说,如果有一个销售记录,可以将其按照年份分区存储,每个分区对应一个年份的数据。当需要查询某个特定年份的销售数据时,只需要扫描对应的分区,而不需要扫描整个。 2. 分桶Hive分桶是将按照某一列或多列的哈希值进行分割,并将数据存储到不同的桶中。分桶可以均匀地分散和存储数据,使得查询时可以更快地定位到所需数据。适用于数据量较大、经常需要随机访问的场景。 举例来说,如果有一个用户信息,可以将其按照用户ID进行分桶存储。当需要根据用户ID查询用户信息时,可以通过哈希算法快速定位到对应的桶,然后只需要扫描该桶中的数据。 总结起来,分区适用于按照某一特定列进行数据过滤的场景,而分桶适用于需要快速随机访问数据的场景。在实际使用中,可以根据数据特点和查询需求来选择合适的分区分桶策略,以提升查询性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值