Hive bucket map join
在 Hive 中,当表非常大,而且所有需要关联的表都是分桶表,并且关联字段都是分桶字段,那么我们就可以使用 bucket map join 来关联表。另外需要注意的是,一个表的分桶数是另一个表的分桶数的倍数。
用例子来理解一下什么是 bucket map join。如果一个表的分桶数是 2 ,那么其他表的分桶数必须是 2 或者是 2 的倍数(2,4,6等等)。因此如果满足了前面这些条件,那么表的 join 操作就只会在 mapper 端进行。否则,表的 join 就是一个普通的 inner join。
在每个 mapper 中,所有表的分桶中只有匹配的分桶会被复制到 mapper 内存中。因此,bucket map join 的执行效率是非常高的。注意在 bucket map join 中,确保数据没有排序。
另外需要注意的,默认情况下,Hive 不支持 bucket map join。所以我们需要把下面的属性设置为 true:
set hive.optimize.bucketmapjoin = true
bucket map join 原理
多个表使用 bucket map join 来关联的时候,关联操作只会在 mapper 端进行。换一种方式来理解就是,mapper 处理 A 表的分桶1的时候,它只会从 B 表的分桶 1 取数据。即分桶之间做关联。
bucket map join 使用场景
bucket map join 适用于以下场景:
- 所有的表都非常大
- 关联字段使用的是表的分桶字段
- 一个表的分桶数是另一个表的分桶数的倍数
- 所有的表都是不排序的
bucket map join 缺点
使用 bucket map join 主要的缺点就是必须要根据 SQL 代码的特点来对表做分桶,也就是说,SQL 中的关联字段和表的分桶字段要一致才行。只要关联字段和分桶字段不一致,我们就没办法使用 bucket map join 了。
使用 bucket map join 相关技巧
首先,表的分桶字段与关联字段要保持一致。另外,在插入数据的时候要对表做分桶,其中有一种方式就是在插入数据之前把 hive.enforce.bucketing
参数设置为 true
。
set hive.enforce.bucketing=true
比如:
create table b1(
col0 string,
col1 string,
col2 string,
col3 string,
col4 string,
col5 string,
col6 string
)
clustered by (col0) into 32 buckets;
create table b2(
col0 string,
col1 string,
col2 string,
col3 string,
col4 string,
col5 string,
col6 string
)
clustered by (col0) into 8 buckets;
set hive.enforce.bucketing = true;
insert OVERWRITE table b1 select * limit 10000;
insert OVERWRITE table b2 select * limit 10000;
在做关联的时候把下面参数设置为 true
set hive.optimize.bucketmapjoin=true;
关联代码:
select /*+ MAPJOIN(b2) */ b1.*
from b1,b2
where b1.col0=b2.col0;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论