hive分桶操作,按照分桶的id去指定查询。

在进行hive大表操作的时候,我们常常使用分区去进行指定查询以加快查询速度,其实分桶也是一种很好的选择:

        1、分桶将文件进行切块,哈希散列,均匀的存储于hdfs中,避免数据倾斜;

        2、分桶join的时候,效率更高;

     但是也会遇到一些查询方面的问题,如果是分区表,直接指定分区字段即可快速过滤定位到所需查询的数据,但是在分桶表中,无法直接定位到具体的桶。笔者进行相关的搜索和查询MapReduce源码,分桶的操作实际上是对数据进行不同的存储文件中,MapReduce中,多少个分桶即产生不同的reduce个数,即找到他是如何进行reduce分区逻辑即可:

public int getPartition(K key, V value, int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}

可以看到,分区原则是key的哈希值  和  int的最大值进行做与运算,保证哈希的值是一个正数,再去余我们的分区数或者分桶数,得到他最终落到哪一个桶。

所以我们可以直接指定桶进行查询:

select id 
from table_name tablesample (bucket X out of Y on id)
        

查询id的具体分桶:

SELECT (hash(id) & 2147483647) % 桶个数 +1

如果我们分桶4个,上面代码具体桶在 1 ,则查询该idSQL可以写

select id 
from table_name tablesample (bucket 1 out of 4 on id)
where id = $id

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值