Hive优化--Map Join

适用场景:大表join小表

Map Join算法可以通过两个只有map阶段的Job完成一个join操作。

具体操作流程

若某join操作满足要求

  • 第一个Job会读取小表数据,将其制作为hash table

  • 将hash table上传至Hadoop分布式缓存(本质上是上传至HDFS)

  • 第二个Job会先从分布式缓存中读取小表数据,并缓存在Map Task的内存中

  • 然后扫描大表数据,这样在map端即可完成关联操作

触发方式

Map Join有两种触发方式

一种是用户在SQL语句中增加hint提示,不建议使用

另外一种是Hive优化器根据参与join表的数据量大小,自动触发

自动触发

Hive在编译SQL语句阶段,起初所有的join操作均采用Common Join算法实现。

之后在物理优化阶段:

根据每个Common Join任务所需表的大小判断该Common Join任务是否能够转换为Map Join任务,若满足要求,便将Common Join任务自动转换为Map Join任务。

如果在SQL的编译阶段不能确定是否能够转换的,(例如对子查询进行join操作)。

针对这种情况,Hive会在编译阶段生成一个条件任务(Conditional Task)

--启动Map Join自动转换
set hive.auto.convert.join=true;

-- 一个Common Join operator转为Map Join operator的判断条件,
-- 若该Common Join相关的表中,存在n-1张表的已知大小总和<=该值,则生成一个Map Join计划,
-- 此时可能存在多种n-1张表的组合均满足该条件,则hive会为每种满足条件的组合均生成一个Map Join计划,
-- 同时还会保留原有的Common Join计划作为后备(back up)计划
-- 实际运行时,优先执行Map Join计划,若不能执行成功,则启动Common Join后备计划。
set hive.mapjoin.smalltable.filesize=250000;

-- 开启无条件转Map Join
set hive.auto.convert.join.noconditionaltask=true;

-- 无条件转Map Join时的小表之和阈值,若一个Common Join operator相关的表中,
-- 存在n-1张表的大小总和<=该值,此时hive便不会再为每种n-1张表的组合均生成Map Join计划
-- 同时也不会保留Common Join作为后备计划。而是只生成一个最优的Map Join计划。
set hive.auto.convert.join.noconditionaltask.size=10000000;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值