SMB Join(Sort Merge Bucket Join)

一、作用

大表对小表应该使用MapJoin来进行优化,但是如果是大表对大表,如果进行shuffle,那就非常可怕,第一个慢不用说,第二个容易出异常,此时就可以使用SMB Join来提高性能。SMB Join基于bucket-mapjoin的 有序 bucket,可实现在map端完成join操作,可以有效地减少或避免shuffle的数据量。SMB join的条件和Map join类似但又不同。

二、条件

bucket mapjoinSMB join
set hive.optimize.bucketmapjoin = true;set hive.optimize.bucketmapjoin = true;set hive.auto.convert.sortmerge.join=true;set hive.optimize.bucketmapjoin.sortedmerge = true;set hive.auto.convert.sortmerge.join.noconditionaltask=true;
一个表的bucket数是另一个表bucket数的整数倍小表的bucket数=大表bucket数
bucket列 == join列bucket列 == join列
必须是应用在map join的场景中必须是应用在bucket mapjoin 的场景中

三、确保分桶列排序

hive并不检查两个join的表是否已经做好bucket且sorted,需要用户自己去保证join的表数据sorted,否则可能数据不正确。
有两个办法:

  1. hive.enforce.sorting 设置为 true。开启强制排序时,插数据到表中会进行强制排序,默认false。

  2. 插入数据时通过在sql中用distributed c1 sort by c1 或者 cluster by c1
    另外,表创建时必须是CLUSTERED且SORTED,如下:

    create table test_smb_2(mid string,age_id string)
    CLUSTERED BY(mid) SORTED BY(mid) INTO 500 BUCKETS;
    

四、分桶表操作的齐全配置

  • 开启MapJoin的配置(hive.auto.convert.join和hive.auto.convert.join.noconditionaltask.size),还有限制对桶表进行load操作(hive.strict.checks.bucketing)可以直接设置在hive的配置项中,无需在sql中声明。
  • 自动尝试SMB联接(hive.optimize.bucketmapjoin.sortedmerge)也可以在设置中进行提前配置。
    --写入数据强制分桶
    set hive.enforce.bucketing=true;
    --写入数据强制排序
    set hive.enforce.sorting=true;
    --开启bucketmapjoin
    set hive.optimize.bucketmapjoin = true;
    --开启SMB Join
    set hive.auto.convert.sortmerge.join=true;
    set hive.auto.convert.sortmerge.join.noconditionaltask=true;
    
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值