hive分桶表

分桶表

  • 与分区的分目录不同,分桶是将数据按照指定的字段进行划分到多个文件当中去,分桶就是MapReduce中的分区.
  • 分桶规则:对分桶字段值进行哈希,哈希值除以桶的个数求余,余数决定了该条记录在哪个桶中,也就是余数相同的在一个桶中。
  • 优点:1、提高join查询效率 2、提高抽样效率

标题分桶表操作

  • 开启 Hive 的分桶功能

set hive.enforce.bucketing=true;

  • 创建临时表
create table temp (
name string,
type string
) row format delimited fields terminated by ' ';
  • 创建分桶表 type为分桶字段,into 3 buckets表示将表数据分成三个桶,底层其实就是根据type进行分区将type的哈希值对3取模。
create table myuser 
(
name string,
type string
) clustered by(type) into 3 buckets row format delimited fields terminated by ' ';
  • 本地有一个用户信息文件包含用户名和所在部门 user.txt
jack 测试
tom 开发
shy 销售
duke 开发
zoom 销售
penut 销售
leyan 销售
jkl 开发
ning 测试
faker 销售
wwk 销售
  • 将user.txt 加载到temp表
load data local inpath '/root/user.txt' into table temp;
  • 通过insert overwrite给桶表中加载数据
insert overwrite table myuser select * from temp cluster by(type);
  • 然后查看分桶表 可以发现将相同部门的员工分到了同一个桶中,这样就完成了分桶操作。
shy     销售
zoom    销售
penut   销售
leyan   销售
faker   销售
wwk     销售
jack    测试
ning    测试
tom     开发
duke    开发
jkl     开发

分桶提高抽样效率

  • 抽样语法 tablesample (bucket x out of y on z); 表示根据z字段将数据分成y份,取第x份。
  • 如下表示将myuser表数据根据type字段分成三份取第二份 可以看到把测试部门数据取出来了。
hive> select * from myuser tablesample (bucket 2 out of 3 on type);
OK
jack    测试
ning    测试
  • 因为myuser就是按照type分桶的,所以抽样时直接将第二个桶数据取出,非常高效,无需全表遍历。
  • 如果按照其他字段进行抽样,就无法进行达到提高效率的目的了,仍然需要全表查询。
hive> select * from myuser tablesample (bucket 2 out of 3 on name);
OK
shy     销售
penut   销售
jack    测试

分桶提高join效率

  • 假设我们除了员工表还有一张经理表,表示每个部门的经理是谁
    user
shy     销售
zoom    销售
penut   销售
leyan   销售
faker   销售
wwk     销售
jack    测试
ning    测试
tom     开发
duke    开发
jkl     开发
   manager
销售 马云
测试 马化腾
开发 李彦宏
  • 假设两张表都是大表,而且两个表都根据type字段进行分桶。
  • 那么在进行join操作时就可以表A的每个桶就可以和表B对应的桶直接join,而不用全表join,提高查询效率。
  • 比如user表的销售桶数据与manager销售桶数据进行join,测试桶与测试桶数据进行join。将各自join的结果再通过union all进行合并即可。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值