hive 的 left semi join 讲解与left jion的区别
一:介绍
他们都是 hive join 方式的一种,join on 属于 common join(shuffle join/reduce join),
而 left semi join 则属于 map join(broadcast join)的一种变体,从名字可以看出他们的实现原理有差异。
二:区别
(1)Semi Join,也叫半连接,是从分布式数据库中借鉴过来的方法。它的产生动机是:对于reduce side join,跨机器的数据传输量非常大,这成了join操作的一个瓶颈,如果能够在map端过滤掉不会参加join操作的数据,则可以大大节省网络IO,提升执行效率。
实现方法很简单:选取一个小表,假设是File1,将其参与join的key抽取出来,保存到文件File3中,File3文件一般很小,可以放到内存中。在map阶段,使用DistributedCache将File3复制到各个TaskTracker上,然后将File2中不在File3中的key对应的记录过滤掉,剩下的reduce阶段的工作与reduce side join相同。
由于 hive 中没有 in/exist 这样的子句(新版将支持),所以需要将这种类型的子句转成 left semi join。left semi join 是只传递表的 join key 给 map 阶段 , 如果 key 足够小还是执行 map join, 如果不是则还是 common join。关于 common join(shuffle join/reduce join)的原理请参考文末 refer。
(2)left semi join 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。
(3)对待右表中重复key的处理方式差异:因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过,而 join on 则会一直遍历。
最后的结果是这会造成性能,以及 join 结果上的差异。
(4)left semi join 中最后 select 的结果只许出现左表,因为右表只有 join key 参与关联计算了,而 join on 默认是整个关系模型都参与计算了。
三:注意事项:两种 join 的“坑”
由于HIVE中都是等值连接,在JOIN使用的时候,有两种写法在理论上是可以达到相同的效果的,但是由于实际情况的不一样,子表中数据的差异导致结果也不太一样。
写法一: left semi joinselecta.bucket_id,a.search_type,a.level1,a.name1,a.level2,a.name2,cast((a.alipay_fee) as double) as zhuliu_alipay,cast(0 as double) as total_alipayfrom tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 aleft semi jointmall_data_fdi_dim_main_auc bon (a.level2 = b.cat_id2and a.brand_id = b.brand_idand b.cat_id2 > 0and b.brand_id > 0and b.max_price = 0)
结果是 3121 条
写法二: join onselecta.bucket_id,a.search_type,a.level1,a.name1,a.level2,a.name2,cast((a.alipay_fee) as double) as zhuliu_alipay,cast(0 as double) as total_alipayfrom tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 ajoin tmall_data_fdi_dim_main_auc bon (a.level2 = b.cat_id2and a.brand_id = b.brand_id)where b.cat_id2 > 0and b.brand_id > 0and b.max_price = 0
结果是 3142 条
这两种写法带来的值居然不是相等的,我一直以为理解这两种方式的写法是一样的, 但是统计的结果却是不一样的。
经过一层一层的查找,发现是由于子表(tmall_data_fdi_dim_main_auc)中存在重复的数据,当使用JOIN ON的时候,A,B表会关联出两条记录,应为ON上的条件符合;
而是用LEFT SEMI JOIN 当A表中的记录,在B表上产生符合条件之后就返回,不会再继续查找B表记录了,所以如果B表有重复,也不会产生重复的多条记录。
大多数情况下 JOIN ON 和 left semi on 是对等的,但是在上述情况下会出现重复记录,导致结果差异,所以大家在使用的时候最好能了解这两种方式的原理,避免掉“坑”。
hive 的 left semi join 讲解与left jion的区别相关推荐
- hive 的 left semi join 讲解
介绍 LEFT SEMI JOIN (左半连接)是 IN/EXISTS 子查询的一种更高效的实现. 示例 可以改写为 特点 1.left semi join 的限制是, JOIN 子句中右边的表只能在 ...
- 【Hive】left semi join(exists、in)和 left join 区别
left semi join(exists.in)和 left join 区别 left semi join 基本认识 对比 执行计划 小结 left semi join 基本认识 LEFT SEMI ...
- join left semi_HIVE--left semi join
实验: hive> select * from b1; OK 1 003 20170511 1 004 20170512 1 005 ...
- join left semi_Hive的left join、left outer join和left semi join三者的区别
Hive的Join的文档说明地址: https://cwiki.apache.org/confluence/display/Hive/LanguageManual%2BJoins 以下为两个测试数据表 ...
- hive之full outer join(全连接)使用方法
目录 介绍 语法 例子 创建顾客表:customers 创建订单表:orders ?full outer join语句 ? left join + union + right join语句 介绍 fu ...
- Hive中HSQL中left semi join
Hive中HSQL中left semi join 证明在Hive 2.1.1版本中,是支持where子句中的子查询,SQL常用的exist in子句在Hive中是不支持的,但可以使用一个更高效的实现方 ...
- Hive left semi join ,select 和 where中不能出现右表字段/不会生成笛卡尔积
1 left semi join的时间比in的时间短,比in高效 2 left semi join时select中不能出现右表的字段,不然报错 3 left semi join 时on中出现左表字 ...
- Hive 实现 IN 和 NOT IN 子句 和 LEFT SEMI JOIN 应用
目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现. 假设有一个用户浏览商品表skim,和一个用户购买商品表buy.如下 skim表 userId ite ...
- Hive中的map join、left semi join和sort merge bucket join
map join map join是将join双方比较小的表直接分发到各个 map进程的内存中,在map进程中进行join操作,这样就不用进行reduce步骤,从而提高了速度. 如果不指定mapjoi ...
最新文章
- python浏览上一句_python一句话启动http服务
- vue从入门到精通之进阶篇(三)axios
- Matlab快速入门
- 金融时报:人工智能在银行中的应用—对全球30家大型银行的调查
- 【项目管理】项目进度管理的关键路径
- (41)zabbix监控api接口性能及可用性 天气预报api为例
- 通用权限系统快速开发框架
- STM32程序下载1:通过keil-ST-Link方式下载
- h5策划书_一个成功的H5策划方案有哪些注意的点
- mysql 中电话号码_类型-电话号码和地址的mysql数据类型
- C1见习工程师(一)
- ABC162 D RGB Triplets
- px,dpi,分辨率,屏幕尺寸,dp 之间的关系
- Exp2 后门原理与实践 20164302 王一帆
- mysql sasl_SASL认证失败的原因(authentication failed)
- 【基础】603- 深入分析Session和Cookie
- 基本系统调用性能lmbench测试方法和下载
- 应用容器化之Kubernetes实践
- 太白金星的考验----python while循环的执着
- 加拿大存储厂商将在二战掩体中建设云数据中心
热门文章
- Android进阶:框架打造之IOC框架
- VC线程同步技术剖析
- SSL WSS HTTPS
- java同步队列_Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理
- 前端框架——Jquery——基础篇7__工具函数(Utils)
- 简述计算机的主要分类及应用领域,【内存分类及特点是什么】_简述计算机内存的分类及各自特点?...
- 高性能MySQL-3rd-(五)创建高性能索引
- 转一篇关于IIS用户权限的帖子
- ssh等价性的一些疑惑
- J2ME移动应用开发实战视频教程