Hadoop 在多个列上按群集的配置单元

Hadoop 在多个列上按群集的配置单元,hadoop,hive,buckets,Hadoop,Hive,Buckets,我知道,当配置单元表在一列上按聚集时,它会对该带扣列执行哈希函数,然后将该行数据放入其中一个桶中。每个bucket都有一个文件,即如果有32个bucket,那么hdfs中就有32个文件 在多个列上使用clustered by意味着什么?例如,假设表已按(大陆、国家)聚集到32个桶中 如果有多个列,如何执行哈希函数 将生成多少个文件?这仍然是32吗?一般来说,bucket编号由表达式hash_函数(bucketing_列)mod num_bucket确定。(里面也有一个'0x7FFFFFFF,但这

我知道,当配置单元表在一列上按聚集时,它会对该带扣列执行哈希函数,然后将该行数据放入其中一个桶中。每个bucket都有一个文件,即如果有32个bucket,那么hdfs中就有32个文件

在多个列上使用clustered by意味着什么?例如,假设表已按(大陆、国家)聚集到32个桶中

如果有多个列,如何执行哈希函数


将生成多少个文件?这仍然是32吗?

一般来说,bucket编号由表达式hash_函数(bucketing_列)mod num_bucket确定。(里面也有一个'0x7FFFFFFF,但这并不重要)。hash_函数取决于bucketing列的类型。对于int,很简单,hash_int(i)==i。例如,如果user_id是int,有10个bucket,那么我们希望所有以0结尾的user_id都在bucket 1中,所有以1结尾的user_id都在bucket 2中,等等。对于其他数据类型,这有点棘手。特别是,BIGINT的哈希与BIGINT不同。字符串或复杂数据类型的散列将是从该值派生的数字,但不是任何人类可以识别的数字。例如,如果user_id是一个字符串,那么bucket 1中的user_id可能不会以0结尾。通常,基于散列分布行将使您在存储桶中获得均匀分布

参考:

  • 是的,文件数仍然是32
  • 散列函数将把“大陆,国家”看作一个字符串,然后使用它作为输入

  • 希望能有帮助

    我的问题更多的是关于有两个专栏参与的情况。是的,我理解这个问题。因为我们知道,如果我们不将hive.exforce.bucketing设置为true;启动的减速器数量将等于铲斗数量。所以在这种情况下,是的,它将只创建32个。谢谢@Maddy。那么这也意味着什么时候必须在大陆和国家进行连接?如果只在一个列上执行连接,例如在国家/地区,它是否具有相同的性能优势?如果bucketing作为复合列应用于两个列上,则bucket map连接仅在使用两个列作为连接条件时才会受益。如果您仅使用其中一个(即本例中的国家/地区)作为加入标准,这将不会有帮助。我们是否无法控制这种行为??