Hive 在多个列上聚集

Posted

技术标签:

【中文标题】Hive 在多个列上聚集【英文标题】:Hive clustered by on more than one column 【发布时间】:2015-09-01 11:51:53 【问题描述】:

我知道,当 hive 表在某一列上聚集时,它会对该分桶列执行哈希函数,然后将该行数据放入其中一个桶中。每个存储桶都有一个文件,即如果有 32 个存储桶,则 hdfs 中有 32 个文件。

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

如果列多于一列,哈希函数将如何执行?

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

【问题讨论】:

【参考方案1】:
    是的,文件数仍为 32。 哈希函数将通过将“大陆,国家”视为单个字符串进行操作,然后将其用作输入。

希望对你有帮助!

【讨论】:

谢谢@Maddy。那么这也意味着什么时候必须在大陆和国家上执行join?如果仅对一列(例如国家/地区)执行联接,它是否具有相同的性能优势? 如果将分桶作为复合列应用于两列,则只有在将两列都用作连接条件时,桶映射连接才会受益。如果您只使用其中一个(即本例中的国家/地区)作为连接条件,这将无济于事。 这种行为是我们无法控制的,应该怎么办??【参考方案2】:

一般来说,桶数由表达式 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

【讨论】:

我的问题更多是关于分桶涉及两列的情况。 是的,我理解这个问题。因为我们知道如果我们不设置 hive.enforce.bucketing = true;启动的 reduceres 的数量将等于桶的数量。所以在这种情况下是的,它只会创建 32 个。

以上是关于Hive 在多个列上聚集的主要内容,如果未能解决你的问题,请参考以下文章

具有不同排序方向的多列上的Sql server聚集索引

使用多个 OUTER APPLY 优化查询

插入 HIVE 表时转换值

怎么取消自增列上的聚集索引

学习笔记Hive—— 自定义函数

索引视图的两列上的唯一聚集索引