Hive中的map join、left semi join和sort merge bucket join
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相关推荐
- Hive 基础(1):分区、桶、Sort Merge Bucket Join
Hive 已是目前业界最为通用.廉价的构建大数据时代数据仓库的解决方案了,虽然也有 Impala 等后起之秀,但目前从功能.稳定性等方面来说,Hive 的地位尚不可撼动. 其实这篇博文主要是想聊聊 S ...
- oracle 非等值关联 优化,Oracle优化器、优化模式、表的连接方式(Hash Join、Nested Loop、Sort Merge Join)...
查询优化器 Oracle的查询优化器(QO)分为两种: 1. RBO:Ruled-Based Optimization, 基于规则的优化器: 2. CBO :Cost-Based Optimizati ...
- hive中的map函数
在拼接画像标签的时候,了解到这个很少用的map函数.的确好用,不光节省资源,而且可以添加权重分值,还可以计算封装的标签的数量. 代码: flag:标签 cnt:权重 str_to_map(CONCAT ...
- Hive中的distribute by、order by、sort by解析
distribute by 是控制map端在reduce上是如何区分的,distribute by会把相同的Keyf放到同一个reduce中.可以结合sort by 使用,distribute by必 ...
- Bucket Join:分桶Join
Bucket Join:分桶Join 场景:大表join大表,多次join 实现 step1:将两张大表的数据构建分桶 数据按照分桶的规则拆分到不同的文件中 分桶规则=MapReduce分区的规则=k ...
- 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN
表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...
- Nested Loop,Sort Merge Join,Hash Join
三种连接工作方式比较: Nested loops 工作方式是从一张表中读取数据,访问另一张表(通常是索引)来做匹配,nested loops适用的场合是当一个关联表比较小的时候,效率会更高. Merg ...
- 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN【转】
表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...
- 谈笑间学会大数据-Hive中的排序
你可以不够优秀,但是不要甘于平凡.-- 阿尼古 Hive中的四种排序 order by . sort by . distribute by .cluster by 首先贴一下官网对于Hive排序的几种 ...
最新文章
- golang并发编程goroutine+channel(一)
- 第4章 利用三层交换机实现VLAN间路由lan配置
- supercharge快充_华为10V 2A充电器曝光,支持20W电荷泵快充
- 条件随机场CRF简介Introduction to Conditional Random Fields
- php接口 含义,php晋级必备:一文读懂php接口特点和使用!
- 微博拟全球发售1100万股 发售价不超388港元
- 什么是Intel LBR(上次分支记录),BTS(分支跟踪存储)和AET(体系结构事件跟踪)?
- python mysql numpy_Python 之Numpy应用
- JDK8 Stream操作整理
- 图纸怎么折?(A0,A1,A2,A3の图纸如何折成A4大小)
- FFmpeg再学习 -- Linux 安装说明
- 【计算机网络】常见面试题总结
- Openstack-实践4.Manila 部署及功能验证
- Java学习参考书籍
- 送学计算机男生什么礼物好,【送男生礼物】送男生礼物_送男生|男朋友|老公什么礼物比较好...
- flink启动命令参数_Flink命令行 - 1.10
- blueman.bluez.errors.DBusFailedError: Protocol not available...
- URLDecoder.decode
- IDEA设置背景图像
- 简单易懂的英特尔E系列超频电压设…