Hive学习笔记(四)—Hive分桶表

一、分桶简介

  • 桶是通过对指定列进行哈希计算来实现的,通过哈希值将一个列名下的数据切分为一组桶,并使每个桶对应于该列名下的一个存储文件
  • 将表中记录按分桶键的哈希值分散进多个文件中,这些小文件称为桶
  • 对于每一个表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分
  • Bucket是对指定列进行hash,然后根据hash值除以桶的个数进行求余,决定该条记录存放在哪个桶中

二、分桶操作

1. 创建桶表:

create table student(
id int,
age int,
name string
)
partitioned by (stat_date string)
clustered by (id) sorted by(age) into 2 bucket
row format delimited fields terminated by ',';

数据先partitioned by (stat_date string),再clustered by (id) sorted by(age) into 2 bucket,先分区再进行分桶

2. 设置环境变量:让程序自动分配reduce的数量从而适配相应的bucket数量

 set hive.enforce.bucketing=true;

3. 插入数据:从临时表导入数据,需要经过MR

from student_tmp
insert overwrite table student partition(stat_date='2019-10-08')
select id,age,name where stat_date='2019-10-07' sort by age;

4. 查看文件目录:

hive> dfs -ls /user/hive/warehouse/student1/stat_date=2019-10-08;

两个目录:
/user/hive/warehouse/student1/stat_date=2019-10-08/000000_0
/user/hive/warehouse/student1/stat_date=2019-10-08/000001_0

5. 查看 sampling 数据

hive> select * from student1                     
    > TableSample(bucket 1 out of 2 on id); 

这里指的是查询 2/2 = 1个bucket数据,从第1个bucket开始

tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)

  • x表示从哪个bucket开始抽取
  • y表示抽样的比例,桶数/y

例如:桶数64,tablesample(bucket 3 out of 32)
总共抽取(64/32=)2个bucket的数据,分别为第3个bucket和第(3+32=)35个bucket的数据

三、分桶的优缺点

  • 分桶取样更高效,因为在处理大规模的数据集时,在开发、测试阶段将所有的数据全部处理一遍可能不太现实,如果一个表已经对某一列制作了bucket,就可以采样所有桶中指定序号的某个桶,这就减少了访问量
  • 为了获得更好的查询处理效率, 桶为了表提供了额外的结构,Hive在处理某些查询时利用这个结构,能给有效地提高查询效率
  • 连接两个在相同列上划分了桶的表,可以使用 Map-side Join 的高效实现,优化join操作(下一篇笔记会讲)
  • 缺点:使用业务字段来查询的话,没有什么效果
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值