【发布时间】:2015-09-01 11:51:53
【问题描述】:
我知道,当 hive 表在某一列上聚集时,它会对该分桶列执行哈希函数,然后将该行数据放入其中一个桶中。每个存储桶都有一个文件,即如果有 32 个存储桶,则 hdfs 中有 32 个文件。
在多个列上聚类是什么意思?例如,假设该表有 CLUSTERED BY (continent, country) INTO 32 BUCKETS。
如果列多于一列,哈希函数将如何执行?
会生成多少个文件?这还是 32 岁吗?
【问题讨论】:
我知道,当 hive 表在某一列上聚集时,它会对该分桶列执行哈希函数,然后将该行数据放入其中一个桶中。每个存储桶都有一个文件,即如果有 32 个存储桶,则 hdfs 中有 32 个文件。
在多个列上聚类是什么意思?例如,假设该表有 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 是一个 int,并且有 10 个桶,我们希望所有以 0 结尾的 user_id 都在桶 1 中,所有以 1 结尾的 user_id 都在桶 2 中,等等。对于其他数据类型,它是有点棘手。特别是,BIGINT 的哈希值与 BIGINT 不同。字符串或复杂数据类型的哈希值将是从值派生的某个数字,但不是任何人类可识别的数字。例如,如果 user_id 是一个 STRING,则存储桶 1 中的 user_id 可能不会以 0 结尾。通常,基于哈希分配行将使您在存储桶中分布均匀。
参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables
【讨论】: