首页 > 解决方案 > Hive Bucketing:不同列值的数量大于桶数的数量

问题描述

在 hive 中,假设我有一个有 1000 条记录的表员工,并且我正在使用主题列进行存储。主题列的总不同值是 20,但我的桶总数是 6。改组是如何发生的?

在理解分桶时,我遇到了两件事:第一:桶将分组所有相同的值,第二:桶将根据哈希函数对数据进行分组。对于上述场景,HIVE 使用哪种方法(第一种或第二种)来洗牌数据?帮助我理解。

标签: hivebigdatahiveqlhadoop-partitioning

解决方案


Hive 根据用户在创建表时决定的值创建存储桶。hive 根据列值哈希函数将数据存储在每个存储桶中,您可以想像

hash_function(bucketing_col_value) mod num_buckets

所以在你的情况下,它会像

bucketing_col_value mod num_buckets

基于所有具有相同哈希值的记录将进入同一个分区。假设您的主题列有 20 个从 1 到 20 的不同值。所以

1 mod 6 = 1 = will go in 1st bucket
2 mod 6 = 2 = will go in 2nd bucket
3 mod 6 = 3 = will go in 3rd bucket
4 mod 6 = 4 = will go in 4th bucket
5 mod 6 = 5 = will go in 5th bucket
6 mod 6 = 6 = will go in 6th bucket
7 mod 6 = 1 = will go in 1st bucket
8 mod 6 = 2 = will go in 2nd bucket
.
.
.
So on..

所以根据你的问题,这两种情况在分桶情况下都是正确的

1st :Bucket 将所有相同的值分组

是的,因为具有相同值的数据将具有相同的哈希值,这意味着它将进入相同的存储桶

2nd:Bucket会根据Hash函数对数据进行分组

就像我之前展示的那样,存储桶将根据数据的哈希值划分数据。

如果您在查询中的数据加载阶段注意到减速器的数量与目标表中的存储桶数量相同。

我希望你现在清楚


推荐阅读