map join

map join是将join双方比较小的表直接分发到各个 map进程的内存中,在map进程中进行join操作,这样就不用进行reduce步骤,从而提高了速度。 如果不指定mapjoin或者不符合mapjoin的条件,那么hive解析器会将join操作转换成common join,即在reduce阶段完成join。容易发生数据倾斜。可以用map join把小表全部加载到内存。在map端进行join,避免reducer处理。

left semi join

left semi join(左半连接)用于替代in/exists操作。

--in/exists
select a.id, a.name from a where a.id in (select b.id from b);
select a.id, a.name from a where exists (select id from b where a.id = b.id);--join(效果等同)
select a.id, a.name from a join b on a.id = b.id;--left semi join(效果等同)
select a.id, a.name from a left semi join b on a.id = b.id;select a.id, a.name from a left semi join b on a.id = b.id and b.id > 2;

(1)left semi join子句右边的表只能在ON子句中设置过滤条件,WHERE 子句、SELECT子句或其他地方过滤都不行。
(2)left semi join只传递表的join key给map阶段,因此left semi join最后select的结果只出现左表内容。
(3)因为left semi join是in(keySet)的关系,如果右表是重复记录,左表会跳过,而使用join的话则会一直遍历。这就导致在右表有重复值的情况下left semi join只产生一条数据,join 会产生多条数据,因此left semi join的性能更高。

参考文章有示例图

sort merge bucket join

SMB目的主要是为了解决大表与大表之间的join 问题,分桶即将大表分为小表,然后Map-Side Join解决,分而治之。

对于map端连接的情况,两个表以相同方式划分桶。处理左边表内某个桶的mapper知道右边表内相匹配的行在对应的桶内。因此,mapper只需要获取右表的那个桶的数据即可进行连接 (只是右表存储数据的一小部分)。这一优化方法不要求两个表必须桶的个数相同,两个表桶的个数是倍数关系也可以。

桶中的数据可以根据一个或多个列进行再排序。这样对每个桶的连接就变成了高效的归并排序,可进一步提升map端效率

创建分桶表后开启SMB
set hive.auto.convert.sortmerge.join=true
set hive.optimize.bucketmapjoin=true;
set hive.optimize.bucketmapjoin.sortedmerge=true;--在join两个分桶表时即可自动使用SMB join。
--从第一个表读取一个存储桶,从第二个表读取相应的存储桶,执行合并排序连接。

Hive中的map join、left semi join和sort merge bucket join相关推荐

  1. Hive 基础(1):分区、桶、Sort Merge Bucket Join

    Hive 已是目前业界最为通用.廉价的构建大数据时代数据仓库的解决方案了,虽然也有 Impala 等后起之秀,但目前从功能.稳定性等方面来说,Hive 的地位尚不可撼动. 其实这篇博文主要是想聊聊 S ...

  2. oracle 非等值关联 优化,Oracle优化器、优化模式、表的连接方式(Hash Join、Nested Loop、Sort Merge Join)...

    查询优化器 Oracle的查询优化器(QO)分为两种: 1. RBO:Ruled-Based Optimization, 基于规则的优化器: 2. CBO :Cost-Based Optimizati ...

  3. hive中的map函数

    在拼接画像标签的时候,了解到这个很少用的map函数.的确好用,不光节省资源,而且可以添加权重分值,还可以计算封装的标签的数量. 代码: flag:标签 cnt:权重 str_to_map(CONCAT ...

  4. Hive中的distribute by、order by、sort by解析

    distribute by 是控制map端在reduce上是如何区分的,distribute by会把相同的Keyf放到同一个reduce中.可以结合sort by 使用,distribute by必 ...

  5. Bucket Join:分桶Join

    Bucket Join:分桶Join 场景:大表join大表,多次join 实现 step1:将两张大表的数据构建分桶 数据按照分桶的规则拆分到不同的文件中 分桶规则=MapReduce分区的规则=k ...

  6. 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN

    表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...

  7. Nested Loop,Sort Merge Join,Hash Join

    三种连接工作方式比较: Nested loops 工作方式是从一张表中读取数据,访问另一张表(通常是索引)来做匹配,nested loops适用的场合是当一个关联表比较小的时候,效率会更高. Merg ...

  8. 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN【转】

    表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...

  9. 谈笑间学会大数据-Hive中的排序

    你可以不够优秀,但是不要甘于平凡.-- 阿尼古 Hive中的四种排序 order by . sort by . distribute by .cluster by 首先贴一下官网对于Hive排序的几种 ...

最新文章

  1. golang并发编程goroutine+channel(一)
  2. 第4章 利用三层交换机实现VLAN间路由lan配置
  3. supercharge快充_华为10V 2A充电器曝光,支持20W电荷泵快充
  4. 条件随机场CRF简介Introduction to Conditional Random Fields
  5. php接口 含义,php晋级必备:一文读懂php接口特点和使用!
  6. 微博拟全球发售1100万股 发售价不超388港元
  7. 什么是Intel LBR(上次分支记录),BTS(分支跟踪存储)和AET(体系结构事件跟踪)?
  8. python mysql numpy_Python 之Numpy应用
  9. JDK8 Stream操作整理
  10. 图纸怎么折?(A0,A1,A2,A3の图纸如何折成A4大小)
  11. FFmpeg再学习 -- Linux 安装说明
  12. 【计算机网络】常见面试题总结
  13. Openstack-实践4.Manila 部署及功能验证
  14. Java学习参考书籍
  15. 送学计算机男生什么礼物好,【送男生礼物】送男生礼物_送男生|男朋友|老公什么礼物比较好...
  16. flink启动命令参数_Flink命令行 - 1.10
  17. blueman.bluez.errors.DBusFailedError: Protocol not available...
  18. URLDecoder.decode
  19. IDEA设置背景图像
  20. 简单易懂的英特尔E系列超频电压设…

热门文章

  1. 【项目】前端实习——知识库项目总结
  2. 开发项目中,360浏览器遇到的一个坑
  3. tpshop带微分销_TPshop分销商城的分销模式
  4. 基于树莓派的微型气象台
  5. POI最新版本 4.1.2 操作 Excel
  6. 关于兼容导入excel2003和excel2007版本注意事项
  7. IE8 使用 Oracle ERP
  8. mysql8删除root用户,Window下如何恢复被删除的Mysql8.0.17 Root账户及密码
  9. 牛客动态规划习题:Min酱要旅行(背包变种)
  10. Vue引用第三方动画库animate.css