0

我是 hive 新手,正在阅读有关 Bucketing 和 MapSide 连接的信息

“映射连接可以利用分桶表(Buckets),因为在左表的一个桶上工作的映射器只需要加载右表的相应桶来执行连接。连接的语法与for相同记忆中的……”

假设我创建一个表

CREATE TABLE bucketed_users (id INT, name STRING) CLUSTERED BY (id) INTO 4 BUCKETS;

我的问题是

1> 是否所有 4 个 Bucket 的大小都相同?还是取决于数据中 id 的频率?即,如果一个 id 重复很多,则相关存储桶的大小将高于其他存储桶。

2> 是否会出现与 id 相关的数据将出现在 2 个不同的存储桶中的情况?即一个 id 的记录存在于存储桶 1 中,而另一条记录存在于存储桶 4 中。

如果是,那么优化器将如何处理分桶数据?

如果有人尝试过,如果他们能分享他们的经验,那就太好了。

4

1 回答 1

1

不久前有人问过这个问题,但由于它仍然是第一个热门话题,也许这会对其他人有所帮助。

在大多数情况下,只需创建一个表就会在集群上创建一个平面文件。您在 Hive 中运行的任何查询都将转换为 Map 和 Reduce 作业。根据定义,您需要键和值才能进入 reduce 阶段,并且每个映射器必须搜索单个平面文件的一块以发现给定的键和值。

当使用分桶表时,Hive 会提供一个按值聚集的哈希值(这里使用 id)并将单个表拆分为多个平面文件。因为表是由 id 的散列拆分的,所以每个拆分的大小基于表中的值。如果您没有将映射到第三个存储桶的值,则该平面文件将为空。除非您忘记在插入语句之前设置 hive.enforce.bucketing = true ,否则您也永远不会在多个存储桶中显示任何给定的 id。

Bucketing 非常适合采样数据和加速使用 cluster by 列作为搜索条件的 select 语句。当您在其聚集列上加入两个表时,当您具有相同(或多个)存储桶时,也会注意到改进。

希望这可以消除一些混乱。

于 2014-09-02T15:11:02.927 回答