我知道,当配置单元表在一列上按聚集时,它会对该列执行哈希函数,然后将该行数据放入其中一个存储桶中。每个bucket都有一个文件,即如果有32个bucket,那么hdfs中就有32个文件。在一个以上的列上聚集是什么意思?例如,假设表已按(大陆、国家)聚集到32个桶中。如果有多个列,如何执行哈希函数?将生成多少个文件?还是32岁吗?
l3zydbqr1#
是的,文件数量仍然是32个。哈希函数将把“大陆,国家”看作一个字符串,然后将其作为输入。希望有帮助!!
pinkon5k2#
通常,bucket编号由表达式hash\ u函数(bucketing\列)mod num\ u bucket确定(里面也有一个'0x7fffffff,但这没那么重要)。哈希函数取决于bucketing列的类型。对于int,很简单,hash_int(i)==i。例如,如果user\u id是int,并且有10个bucket,那么我们希望所有以0结尾的user\u id都在bucket 1中,所有以1结尾的user\u id都在bucket 2中,等等。对于其他数据类型,这有点棘手。特别是,bigint的哈希值与bigint的哈希值不同。字符串或复杂数据类型的散列将是从值派生的数字,但不是任何人类可以识别的数字。例如,如果user\u id是一个字符串,那么bucket 1中的user\u id可能不会以0结尾。一般来说,基于散列分布行将使桶中的分布均匀。裁判:https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl+bucketedtables
2条答案
按热度按时间l3zydbqr1#
是的,文件数量仍然是32个。
哈希函数将把“大陆,国家”看作一个字符串,然后将其作为输入。
希望有帮助!!
pinkon5k2#
通常,bucket编号由表达式hash\ u函数(bucketing\列)mod num\ u bucket确定(里面也有一个'0x7fffffff,但这没那么重要)。哈希函数取决于bucketing列的类型。对于int,很简单,hash_int(i)==i。例如,如果user\u id是int,并且有10个bucket,那么我们希望所有以0结尾的user\u id都在bucket 1中,所有以1结尾的user\u id都在bucket 2中,等等。对于其他数据类型,这有点棘手。特别是,bigint的哈希值与bigint的哈希值不同。字符串或复杂数据类型的散列将是从值派生的数字,但不是任何人类可以识别的数字。例如,如果user\u id是一个字符串,那么bucket 1中的user\u id可能不会以0结尾。一般来说,基于散列分布行将使桶中的分布均匀。
裁判:https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl+bucketedtables