1、联系

他们都是 hive join 方式的一种,join on 属于 common join(shuffle join/reduce join),而 left semi join 则属于 map join(broadcast join)的一种变体,从名字可以看出他们的实现原理有差异。

2、区别

(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 默认是整个关系模型都参与计算了。

3、两种 join 的“坑”

由于HIVE中都是等值连接,在JOIN使用的时候,有两种写法在理论上是可以达到相同的效果的,但是由于实际情况的不一样,子表中数据的差异导致结果也不太一样。

写法一: left semi join

selecta.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 on

selecta.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 是对等的,但是在上述情况下会出现重复记录,导致结果差异,所以大家在使用的时候最好能了解这两种方式的原理,避免掉“坑”。

转载于:https://www.cnblogs.com/zzhangyuhang/p/9792794.html

转载:left join和left semi join的联系和区别相关推荐

  1. left join和left semi join的联系和区别

    ** 转载:left join和left semi join的联系和区别 ** 1.联系 他们都是 hive join 方式的一种,join on 属于 common join(shuffle joi ...

  2. 面试官:说说left join和left semi join 两者有什么区别?

    张工是一名程序员,主要是做java开发,有次到一家软件公司面试软件开发岗位,面试官问了他两个问题,其中有一个问题是这样的这样: 说说left join和left semi join 有什么区别? 对于 ...

  3. ​left join 和 left semi join区别 ​

    左连接与+号, 就是左边的表数据都要. select * from a,b where a.id=b.id(+); (+)写在where后面,不能与or/in连用,ui select * from a ...

  4. join left semi_HIVE--left semi join

    实验: hive> select * from b1; OK 1       003     20170511 1       004     20170512 1       005     ...

  5. join left semi_Hive的left join、left outer join和left semi join三者的区别

    Hive的Join的文档说明地址: https://cwiki.apache.org/confluence/display/Hive/LanguageManual%2BJoins 以下为两个测试数据表 ...

  6. left join和left semi join的区别

    --建表 create TABLE left_semi_join1(id int,name STRING );create TABLE left_semi_join2(id int,age STRIN ...

  7. Hive中的map join、left semi join和sort merge bucket join

    map join map join是将join双方比较小的表直接分发到各个 map进程的内存中,在map进程中进行join操作,这样就不用进行reduce步骤,从而提高了速度. 如果不指定mapjoi ...

  8. Hive中HSQL中left semi join

    Hive中HSQL中left semi join 证明在Hive 2.1.1版本中,是支持where子句中的子查询,SQL常用的exist in子句在Hive中是不支持的,但可以使用一个更高效的实现方 ...

  9. hive 的 left semi join 讲解与left jion的区别

    一:介绍 他们都是 hive join 方式的一种,join on 属于 common join(shuffle join/reduce join), 而 left semi join 则属于 map ...

最新文章

  1. ftp服务器上传的文件打不开,ftp服务器文件有的上传不了
  2. 当对象与原型有相同的属性,调用时的上下文指向问题
  3. SIP协议状态码:480Temporarily Unavailable
  4. linux 文件io实例代码,linux 文件IO(示例代码)
  5. roobo机器人怎么唱歌_日本“观音”机器人问世,可以陪僧人念佛经
  6. python培训来袭_从入门到精通!2020年Python最佳学习路线重磅来袭!
  7. PAT 1011 A+B 和 C(C语言)
  8. ACP 学习-07-CDN
  9. arcgis中的图像裁剪
  10. 计算n阶行列式的C语言实现
  11. SQL Server Management Studio(SSMS)对象资源管理器的使用以及查询分析器的使用
  12. 打造Win10+WSL开发环境(2)
  13. 软件设计 抽象_调试抽象给软件工程师带来正念的好处
  14. JS学习笔记——APIS
  15. 操作系统【清华慕课笔记】
  16. JavaScript ES6中Object的新增方法
  17. AGV的关键技术与细节
  18. python怎么编写对称图案_python – 无论matplotlib中的箭头角度如何,都使箭头形状对称...
  19. CES包罗万象 家用清洁机器人将亮相展会
  20. 善用产业链招商,打造产业集群效应,实现产业协同发展

热门文章

  1. easy_runner一个简单的压测程序
  2. CENTOS7.2使用RDO方式安装OpenStack Mitaka笔记
  3. HTML5 LocalStorage 本地存储JSON数据
  4. 使用Xcode和Instruments调试解决iOS内存泄露【转】
  5. GNU make manual 翻译(六十一)
  6. Java实现算法导论中有限自动机字符串匹配算法
  7. (转载)c++内存池实现 .
  8. @Value获取值和@ConfigurationProperties获取值比较||配置文件注入值数据校验
  9. MATLAB中的字符串处理
  10. Node.js 安装报错提示“The error code is 2503“问题解决方法