Hive分区分桶

Hive分区分桶


前言

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


提示:以下是本篇文章正文内容,下面案例可供参考

一、分区

1.简介

当Hive在进行select操作时,正常会扫描整个表内容。而随着系统运行的时间增加,表的数据量也越来越大,而hive查询做全表扫描,会消耗很多时间,降低效率。而有时候,我们需求的数据只需要扫描表中的一部分数据即可。于是,hive在建表时引入了partition概念。即在建表时,将整个表存储在不同的子目录中,每一个子目录对应一个分区。在查询时,我们就可以指定分区查询,避免了hive做全表扫描,从而提高查询效率。

2.语法

create table tableName(
.......
)
partitioned by (colName colType [comment '...'],...)

3.示例

create table if not exists example1(
id int,
name string,
age int
)
partitioned by (dt string)
row format delimited 
fields terminated by ','
lines terminated by '\n';

二级分区:

create table if not exists example2(
id int,
name string,
age int
)
partitioned by (year string,month string)
row format delimited 
fields terminated by ',';

二、分桶

1.简介

在 Hive 中,通过对表中的列运用哈希函数做哈希计算,根据计算出来的哈希值将表或分区细分为多个桶。而且每个桶的大小几乎一样。以便提高查询效率。

2.原理

类似MapReduce中的HashPartitioner的原理
MapReduce:使用key的hash值对reduce的数量进行取模(取余)
hive:使用分桶字段的hash值对分桶的数量进行取模(取余)。针对某一列进行分桶存储。每一条记录都是通过分桶字段的值的hash对分桶个数取余,然后确定放入哪个桶。

3.意义

分桶表适合进行数据抽样 抽样更高效。处理大数据时,如果能在数据集的一部分上运行查询进行测试会带来很多方便

4.示例

建表

create table example3(id int, name string)
clustered by(id) 
into 4 buckets
row format delimited fields terminated by ' ';

设置reduce的数量:

set mapreduce.job.reduces=-1;

总结

这里对文章进行总结:
分区使用的是表外字段,分桶使用的是表内字段
分桶相对于更加细粒度的管理数据,更多的是使用来做抽样

cluster 和 clusted 的区别:一个是导入数据的时候调用的,一个是创建表的时候使用的。
sort by 和 sorted by 区别:sort by 是导入数据的时候,sorted by 是分桶排序规则指定的时候
partition by 和 partitioned by 的区别:partition by 一般和开窗函数一起使用,
partitioned by 建表的时候使用。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值