Hive 分桶表 (Bucketed Tables) 『 创建分桶表 | 数据导入』

1. 为什么使用分桶表?

  • 问:查询分区表时,若使用where语句进行分区过滤,那么会对某分区进行全盘扫描。这里又出现了全盘扫描字眼,那么这里可不可以优化呢?
  • 答:可以,把一个大文件按照 某字段(或多个字段) 进行拆分成多个小文件,最终每个文件里存放着 该字段值(或联合字段值相同) 的数据。那么,在查询数据时使用where指定该字段的值就可以找到扫描哪个小文件,不会扫描其他小文件,从而避免了对大文件的全盘扫描。

好处总结:

  1. 基于分桶字段进行where过滤时,可以减少对 对表进行全面 或 对某分区全面扫描(如果是分区表的话),提高效率。
    在这里插入图片描述

  2. 基于分桶字段进行join时可以提高MR程序效率【因为这样可以减少笛卡尔积数量】
    在这里插入图片描述

  3. 从分桶表中每个桶抽取样本,能够有很好的抽样效果,可用于机器学习的样本抽样。

2. 创建分桶表

在创建分桶表时选择clustered by ... into ...buckets关键字。比如:

create table person(
	id int,
	name string comment '名字',
	sex string comment '性别',
	city string comment '城市'
	kind string comment '种族'
) 
partitioned by (sex_part string, city_part string)
-- 分桶字段可以是1个,也可以是多个
-- 还可以使用 sorted by关键字进行排序
clustered by (kind) sorted by (cases desc) into 5 buckets;

注意:

  1. 分桶字段必须是表的字段
  2. 有几个桶就会创建几个文件。分桶表按照分桶字段值 % 分桶数量知道将该行数据放入哪个文件。所以,当分桶字段值的种类数小于分桶个数时,分桶字段值相同的会放入到同一个文件中
    在这里插入图片描述
  3. 如果是在分区表的基础上也是分桶表,那么在会将每个分区的数据文件按照分桶字段拆分成好几个小文件。
    在这里插入图片描述

3. 分桶表的数据导入

  1. 语法:使用insert into + select 关键字

    insert into table_name 
    select * from other_table;
    
  2. 例子:

    --step1:把源数据加载到普通hive表中
    CREATE TABLE itheima.t_usa_covid19(
    	count_date string,
    	county string,
    	state string,
    	fips int,
    	cases int,
    	deaths int
    )
    row format delimited fields terminated by ",";
    
    --step2:将源数据上传到HDFS,t_usa_covid19表对应的路径下
    hadoop fs -put us-covid19-counties.dat  /user/hive/warehouse/itheima.db/t_usa_covid19
    
    --step3:使用insert+select语法将数据加载到分桶表中
    insert into t_usa_covid19_bucket 
    select * from t_usa_covid19
    

    在这里插入图片描述

---- 关于基于分桶字段进行join时的注意事项

基于分桶字段进行join时以达到提高MR效率时,需要提前开启一些功能:
在这里插入图片描述

--开启分桶SMB(Sort-Merge-Buket) join
set hive.optimize.bucketmapjoin = true;
set hive.auto.convert.sortmerge.join=true;
set hive.optimize.bucketmapjoin.sortedmerge = true;

--查看执行计划
explain
select
	a.id,
	a.name,
	b.subject,
	b.num
from tb1 a join tb2 b on a.id = b.id;
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值