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

本文探讨了Hive中使用分区和分桶加速查询的方法,解释了分桶原理,以及如何利用哈希和MapReduce的reduce分区逻辑进行精确查询。作者还提供了查询特定桶的SQL示例。

在进行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

Hive中,(Bucketing)是一种提高查询效率的技术手段。它通过对数据进行哈希区并将每个区存储在一个独立文件夹下的方式来组织数据。而“联合查询”则是指利用机制来进行更高效的连接操作或跨表查询的过程。 ### 的基本原理 当你创建一个带功能的表时,需要指定用于的一列或多列以及的数量。Hive会对这一列取值计算Hash值,并将结果映射到相应的编号上。这意味着所有具有相同键值的数据行都会落入同一个物理文件中。 ```sql CREATE TABLE sales ( id INT, product STRING, amount DOUBLE) CLUSTERED BY (id) INTO 4 BUCKETS; ``` 上面的例子表示按照`id`字段对销售记录进行了四路。 ### 的好处 对于大数据集来说,使用能够减少I/O开销,提升性能,特别是在执行JOIN操作的时候尤为明显。因为两个经过同样规则并且排序过的表格可以直接在一对应的之间完成联结运算,无需再扫描全部数据。 ### 联合查询的应用场景及注意事项 1. **高效Join**: - 如果两张表都根据相同的字段进行了,并且数相等,则可以在这些匹配好的间直接进行join,从而加快速度。 2. **采样析**: - 对于非常大的数据集合,可以通过只读取一部而不是整个数据集来进行快速样本抽取和数据析工作。 3. **注意点**: - 确保参与联接的所有表都有相似程度良好的布(即各之间的数据量尽可能平均),以防止个别节点负载过高影响整体性能; - 要求两者的bucket key一致且数量相同才能发挥最大优势;否则,尽管可以正常运行,但不会享受到预期的速度增益。 总之,合理运用好hive中的技术能极大地改善一些特定类型查询的表现效果,尤其是在涉及多表关联的情况下更是如此。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值