Hive Bucketing:不同列值的数量大于分桶数量
Posted
技术标签:
【中文标题】Hive Bucketing:不同列值的数量大于分桶数量【英文标题】:Hive Bucketing : Number of distinct column value is greater than Number of bucketing number 【发布时间】:2020-01-23 07:54:04 【问题描述】:在 hive 中,假设我有一个有 1000 条记录的表员工,并且我正在使用主题列进行分组。 主题列的总不同值是 20,但我的桶总数是 6。 洗牌是如何发生的?
在理解分桶时,我遇到了两件事 1st :Bucket 将分组所有相同的值和 2nd:Bucket会根据Hash函数对数据进行分组。 对于上述场景,HIVE 使用哪种方法(第一种或第二种)来打乱数据?帮助我理解。
【问题讨论】:
【参考方案1】:Hive 根据用户在创建表时决定的值创建存储桶。 而hive根据列值hash函数将数据存储在每个桶里面 你可以想像
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函数对数据进行分组
就像我之前展示的那样,桶将根据数据的哈希值划分数据。
如果您在数据加载阶段发现查询中的 reducer 数量与目标表中的存储桶数量相同。
希望你现在清楚
【讨论】:
【参考方案2】:在分桶期间,Hive 基于散列函数对值进行分组。还有一条经验法则是,桶的数量是 2 的幂。如果将此规则应用于所有表,Have 就能够优化桶列的连接。
如果您只想将相同的值组合在一起,则必须使用按列进行分区。在这种情况下,您将拥有的目录数量等于不同值的数量,每个目录只有一个值。
【讨论】:
以上是关于Hive Bucketing:不同列值的数量大于分桶数量的主要内容,如果未能解决你的问题,请参考以下文章