Hive分桶

分桶是数据管理的一种技术,通过字段的哈希值对分桶数取模来分配数据,旨在优化查询效率,特别是对于分桶查询和连接操作。创建分桶表时,可以指定分桶字段和数量,查询时可以使用tablesample函数选择特定桶的数据。分桶有助于提高数据抽样和join操作的效率。
摘要由CSDN通过智能技术生成

分桶的概述

为什么要分桶
  • 数据分区可能导致有些分区数据过多,有些分区数据极少。分桶是将数据集分解为若干部分(数据文件)的另一种技术。
  • 分区和分桶其实都是对数据更细粒度的管理。当单个分区或者表中的数据越来越大,分区不能细粒度的划分数据时,我们就采用分桶技术将数据更细粒度的划分和管理
  • [CLUSTERED BY (col_name, col_name, ...)
分桶的原理

与MapReduce中的HashPartitioner的原理一模一样

  • MapReduce:使用key的hash值对reduce的数量进行取模(取余)
  • hive:使用分桶字段的hash值对分桶的数量进行取模(取余)。针对某一列进行分桶存储。每一条记录都是通过分桶字段的值的hash对分桶个数取余,然后确定放入哪个桶。
分桶的意义
  1. 为了保存分桶查询的分桶结构(数据已经按照分桶字段进行了hash散列)
  2. 分桶表适合进行数据抽样
    抽样更高效。处理大数据时,如果能在数据集的一部分上运行查询进行测试会带来很多方便
  3. join操作时可以提高MR的查询效率
    连接查询两个在相同列上划分了桶的表,可以在map端进行高效的连接操作。 比如join操作。对于两个表都有一个相同的列,如果对两个表都进行桶操作,那么hive底层会对相同列值的桶进行join操作。效率很高

分桶表创建

案例

第一步:建表

drop table student;
create table student(
sno int,
name string,
sex string,
age int,
academy string
)
clustered by (sno) sorted by (age desc) into 4 buckets
row format delimited 
fields terminated by ','
;

 #分桶字段和排序字段可以不一致

第二步:加载数据

load data local inpath 'students.txt' into table student;
注意事项

2版本开始,设置了强制分桶操作,因此人为的修改reduce的个数不会影响最终文件的个数(文件个数由桶数决定)

如果是低版本,比如1.2.1版本可以修改下面的属性

1. 需要设置reduce数量和分桶数量相同:
set mapreduce.job.reduces=4;
2.如果数据量比较大,我们可以使用MR的本地模式:
set hive.exec.mode.local.auto=true;  
3.强行分桶设置:set hive.enforce.bucketing=true; 默认是false
4.强行排序设置:set hive.enforce.sorting=true;

分桶表查询

语法:
语法:tablesample(bucket x out of y on sno)
x:代表从第几桶开始查询,x不能大于y

2.1.1版本的y:代表查询的总的桶数 y值可以自定义。
低版本,比如1.2.1的y必须是表的桶数的因子或者是倍数。
查询全部
select * from student;
select * from student tablesample(bucket 1 out of 1);
指定桶查询
查询第一桶
    select * from student tablesample(bucket 1 out of 4 on sno);
查询第一桶和第三桶
    select * from student tablesample(bucket 1 out of 2 on sno);
查询第二桶和第四桶的数据
    select * from student tablesample(bucket 2 out of 2 on sno);        
查询对8取余的第一桶的数据:
    select * from student tablesample(bucket 1 out of 8 on sno);
其他查询
查询三行数据
    select * from student limit 3;
    select * from student tablesample(3 rows);
查询百分比的数据
    select * from student tablesample(13 percent);大小的百分比所占的那一行。
    
查询固定大小的数据
    select * from student tablesample(68b); 单位(K,KB,MB,GB...)
    固定大小所占的那一行。
随机抽三行数据
    select * from student order by rand() limit 3;

更多大数据精彩内容欢迎B站搜索“千锋教育”或者扫码领取全套资料  

【千锋教育】大数据开发全套教程,史上最全面的大数据学习视频

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值