Hive Bucketing基于尺寸



我是hive的新手,读过关于Bucketing和MapSide加入的文章

"映射联接可以利用分块表(Buckets),因为处理左表的bucket的映射器只需要加载右表的相应bucket即可执行联接。联接的语法与内存中的语法相同……">

假设我创建一个表作为

CREATE TABLE bucketed_users(id INT,name STRING)由(id)聚类为4个桶;

我的问题是

1> 是否所有4个桶都有相同的尺寸?还是取决于数据中id的频率?即如果一个id重复很多次,则重新标记的bucket将比其他bucket具有更大的大小。

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

如果是,优化器将如何处理带条带的数据?

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

这个问题是不久前提出的,但由于它仍然是最热门的问题之一,也许这会帮助其他人。

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

当使用带区块的表时,Hive会生成一个按值聚集的散列(这里使用id),并将单个表拆分为许多平面文件因为表是通过id的散列进行拆分的,所以每次拆分的大小都基于表中的值如果没有映射到第三个bucket的值,则该平面文件将为空除非您忘记在insert语句之前设置hive.enforce.bucketing=true,否则您永远不会在多个bucket中显示任何给定的id

Bucketing在采样数据和加速使用clusterby列作为搜索条件的select语句方面非常有效。当您在集群列上的两个表上进行联接时,当它们具有相同(或多个)的bucket时,也会注意到一些改进。

希望这能消除一些困惑。

相关内容

  • 没有找到相关文章

最新更新