Hive 聚集在多个列上

Hive clustered by on more than one column

我了解到,当配置单元 table 聚集在一列上时,它会对该分桶列执行哈希函数,然后将该行数据放入其中一个桶中。每个桶都有一个文件,即如果有 32 个桶,则 hdfs 中有 32 个文件。

在多个列上聚类是什么意思?例如,假设 table 有 CLUSTERED BY (continent, country) INTO 32 BUCKETS。

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

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

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

参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables

  1. 是的,文件数仍为 32。
  2. 哈希函数将通过将 "continent,country" 视为单个字符串来运行,然后将其用作输入。

希望对您有所帮助!!