配置单元bucketing:不同列值的数目大于bucketing数的数目

pqwbnv8z  于 2021-06-25  发布在  Hive
关注(0)|答案(2)|浏览(433)

在hive中,假设我有一个有1000条记录的表雇员,并且我正在与主题列进行匹配。主题列的总非重复值是20,但我的bucket总数是6。洗牌是怎么发生的?
在理解bucketing时,我遇到了两件事:第一,bucket将对所有相同的值进行分组;第二,bucket将根据哈希函数对数据进行分组。对于上面的场景,hive使用哪种方法(第一种或第二种)来洗牌数据?帮助我理解。

fxnxkyjh

fxnxkyjh1#

在bucketing配置单元期间,根据哈希函数对值进行分组。还有一条经验法则是桶的数量是2的幂。如果将此规则应用于所有表,则可以按列优化连接。
如果只想将相同的值分组在一起,就必须使用按列划分的方法。在这种情况下,目录的数量等于不同值的数量,每个目录只有一个值。

f1tvaqid

f1tvaqid2#

配置单元在创建表时根据用户决定的值创建存储桶。hive根据列值散列函数将数据存储在每个bucket中
哈希函数(bucketing col值)mod num buckets
所以你的情况是
bucketing\u col\u value mod num\u 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将所有相同的值分组
是的,因为具有相同值的数据将具有相同的哈希值,这意味着它将放在相同的存储桶中
第二:bucket将根据hash函数对数据进行分组
就像我之前展示的,bucket将根据数据的散列值来划分数据。
如果您注意到在查询的数据加载阶段,reducer的数量和目标表中bucket的数量相同。
我希望你现在明白了

相关问题