Hive Bucketing:不同列值的数量大于 bucketing 数量

Hive Bucketing : Number of distinct column value is greater than Number of bucketing number

在配置单元中,假设我有一个 table 员工,有 1000 条记录,我正在处理主题列。 主题列的总不同值是 20,但我的桶总数是 6。 洗牌是如何发生的?

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

在分桶期间,Hive 根据哈希函数对值进行分组。还有一个经验法则是桶的数量为 2 的幂。如果您将此规则应用于所有表,则 Have 能够优化按桶列的连接。

如果您只想将相同的值组合在一起,则必须按列使用分区。在这种情况下,目录的数量将等于不同值的数量,每个目录只有一个值。

Hive 根据用户在 table 创建时决定的值创建存储桶。 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 will group all the same value

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

2nd :Bucket will group the data based on Hash function

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

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

希望你现在清楚了