[在配置单元中,说我有一个拥有1000条记录的表员工,并且我正在处理主题列。主题列的总不同值是20,但我的存储桶总数是6。改组如何发生?
虽然我了解了这件事,但遇到了两件事1st:Bucket将所有相同的值分组,第二:Bucket将基于哈希功能对数据进行分组。对于上述情况,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..
所以根据您的问题,这两种情况在存储桶情况下都适用
第一:桶将所有相同的值分组
是的,因为具有相同值的数据将具有相同的哈希值,这意味着它将进入相同的存储桶中
第二:Bucket将基于哈希函数对数据进行分组
[就像我展示了较早的存储桶将根据数据的哈希值划分数据。
如果您在数据加载阶段注意到查询的reducer数量与目标表中的存储桶数量相同。
我希望你现在很清楚
在存储分区时,Hive根据哈希函数对值进行分组。经验法则是具有作为桶数的2的幂。如果将此规则应用于所有表,Have可以按值区列优化联接。
如果仅要将相同的值分组在一起,则必须按列使用分区。在这种情况下,目录的数量等于不同值的数量,每个目录只有一个值。