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:不同列值的数量大于分桶数量的主要内容,如果未能解决你的问题,请参考以下文章

hive mysql count distinct 多列

在 Hive 中,分区快还是分桶快?

Hive学习之路 (二十一)Hive 优化策略

Hive的分桶

Hive 查询以使用其他列值的总和获取前 3 列值

详解 Spark 中的 Bucketing