Hive Bucketing:唯一列值的数量大于存储桶数的数量

问题描述 投票:0回答:2

[在配置单元中,说我有一个拥有1000条记录的表员工,并且我正在处理主题列。主题列的总不同值是20,但我的存储桶总数是6。改组如何发生?

虽然我了解了这件事,但遇到了两件事1st:Bucket将所有相同的值分组,第二:Bucket将基于哈希功能对数据进行分组。对于上述情况,HIVE使用哪种方法(第一种或第二种)对数据进行混洗?帮助我了解。

hive bigdata hiveql hadoop-partitioning
2个回答
1
投票

配置单元根据用户在创建表时确定的值来创建存储桶。而且,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..

所以根据您的问题,这两种情况在存储桶情况下都适用

第一:桶将所有相同的值分组

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

第二:Bucket将基于哈希函数对数据进行分组

[就像我展示了较早的存储桶将根据数据的哈希值划分数据。

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

我希望你现在很清楚


0
投票

在存储分区时,Hive根据哈希函数对值进行分组。经验法则是具有作为桶数的2的幂。如果将此规则应用于所有表,Have可以按值区列优化联接。

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

© www.soinside.com 2019 - 2024. All rights reserved.