据我所知,当hive表在一列上聚类时,它会执行该bucketed列的哈希函数,然后将该行数据放入其中一个桶中。并且每个桶都有一个文件,即如果有32个桶,则hdfs中有32个文件。
在多个列上进行聚簇是什么意思?例如,假设该表具有CLUSTERED BY(大陆,国家)INTO 32 BUCKETS。
如果有多列,如何执行散列函数?
将生成多少个文件?这还是32吗?
答案 0 :(得分:6)
希望它有所帮助!!
答案 1 :(得分:0)
通常,存储桶编号由表达式hash_function(bucketing_column)mod num_buckets确定。 (那里也有一个'0x7FFFFFFF,但那并不重要)。 hash_function取决于bucketing列的类型。对于int,它很容易,hash_int(i)== i。例如,如果user_id是一个int,并且有10个桶,我们希望所有以0结尾的user_id都在桶1中,所有user_id以1结尾在桶2中,等等。对于其他数据类型,它是有点棘手。特别是,BIGINT的散列与BIGINT不同。并且字符串或复杂数据类型的散列将是从值中派生的某个数字,但不是人类可识别的任何数字。例如,如果user_id是STRING,那么存储桶1中的user_id可能不会以0结尾。通常,基于散列分配行将使您在存储桶中进行均匀分布。
参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables