基于Hive Bucketing尺寸

时间:2014-03-04 15:54:34

标签: hive buckets

我是hive的新手,正在阅读Bucketing和MapSide加入

“映射连接可以利用分层表(Buckets),因为处理左表的存储区的映射器只需要加载右表的相应存储区来执行连接。连接的语法是与内存中的内容相同......“

假设我创建了一个表

CREATE TABLE bucketed_users(id INT,name STRING) 聚集在(ID)INTO 4 BUCKETS;

我的问题是

1>是否所有4个铲斗都具有相同的尺寸?或者它取决于数据中id的频率?即如果一个id重复很多,则相关的桶将具有比其他桶更大的尺寸。

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

  

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

如果有人试过这个,如果他们可以分享他们的经验会很棒。

1 个答案:

答案 0 :(得分:1)

这个问题刚才被问过,但由于它仍然是第一次点击之一,这可能会对其他人有所帮助。

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

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

Bucketing可以很好地对数据进行采样,并加快使用群集的列作为搜索条件的select语句。当您在其群集列上加入两个表时,如果具有相同(或多个)桶,则会注意到这些改进。

希望这可以解决一些困惑。