左连接与+号, 就是左边的表数据都要。

select * from a,b where a.id=b.id(+);

(+)写在where后面,不能与or/in连用,ui

select * from a left join b on a.id=b.id;    a里面的数据在b里面没有也要的

​left join 和 left semi join区别 ​ :

left join  A表记录全部有,如果B表多行的话,A数据就被重复了一次。

left semi join不重复,找到第一条就返回A行记录,如果找不到A行记录不显示。 就是exists或者 in的意思。

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

select

        a.bucket_id,

        a.search_type,

        a.level1,

        a.name1,

        a.level2,

        a.name2,

        cast((a.alipay_fee) as doubleas zhuliu_alipay,

        cast(0 as doubleas total_alipay

        from tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a

     left semi join

     tmall_data_fdi_dim_main_auc b

     on (a.level2 = b.cat_id2

         and a.brand_id = b.brand_id

         and b.cat_id2 > 0

         and b.brand_id > 0

         and b.max_price = 0

     )

结果是 3121 条

写法二: join on

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

select

        a.bucket_id,

        a.search_type,

        a.level1,

        a.name1,

        a.level2,

        a.name2,

        cast((a.alipay_fee) as doubleas zhuliu_alipay,

        cast(0 as doubleas total_alipay

        from tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a

     join   tmall_data_fdi_dim_main_auc b

     on (a.level2 = b.cat_id2

         and a.brand_id = b.brand_id)

  where  b.cat_id2 > 0

         and b.brand_id > 0

         and b.max_price = 0

  

结果是 3142 条

由于子表(tmall_data_fdi_dim_main_auc)中存在重复的数据,当使用JOIN ON的时候,A,B表会关联出两条记录,应为ON上的条件符合; 
而是用LEFT SEMI JOIN 当A表中的记录,在B表上产生符合条件之后就返回,不会再继续查找B表记录了,所以如果B表有重复,也不会产生重复的多条记录。 如果B中没有A也没有哦

大多数情况下 JOIN ON 和 left semi on 是对等的,但是在上述情况下会出现重复记录,导致结果差异,所以大家在使用的时候最好能了解这两种方式的原理,避免掉“坑”。

​left join 和 left semi join区别 ​相关推荐

  1. 转载:left join和left semi join的联系和区别

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

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

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

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

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

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

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

  5. left join和left semi join的区别

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

  6. join left semi_HIVE--left semi join

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

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

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

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

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

  9. left semi join 和 left join 区别

    left semi join 和 left join 联系和区别 1.都是左表连接,但是semi join右表关联不左表也不会出来,left join不一样 2.semi join只能查询左表信息,l ...

最新文章

  1. 使用OpenCV,Python进行图像哈希(差分哈希 dHash)处理
  2. FPGA之道(34)Verilog初始化与操作符号
  3. 第12周学习进度总结
  4. Nginx 服务器开启status页面检测服务状态
  5. ASP.NET Web API 处理架构
  6. java 释放数组_java集合ArrayList中clear方法内存释放分析
  7. Effective C++:条款37:绝不又一次定义继承而来的缺省參数值
  8. 试除法计算最小的N个素数
  9. 开源图像标注工具labelme的安装使用及汉化
  10. 计算机跨专业考会计专硕,二本二战三跨如何考上985会计专硕之数学篇
  11. 网易云系列爬虫-采集歌单内歌曲热评
  12. 基于STM32单片机电阻电容电感检测仪设计
  13. 1.1计算机解决问题的过程教案,1.1 计算机解决问题的过程
  14. 【中国农业银行风险管理部总经理 田继敏】筑牢IT风险第二道防线 保障银行信息科技安全
  15. 网站优化后如何降低阿里云国际版服务器成本
  16. 如何更改Apple Watch的方向
  17. 文华财经基本函数及语法
  18. 初识智遥工作流软件——表单开发篇2
  19. 数据结构单向链表(C++)
  20. 美联储3月议息会议:表面风平浪静,下面暗流涌动

热门文章

  1. 产品上ref和lot是什么意思_试剂盒REF与LOT分别是什么意思
  2. InputStream read()方法详解
  3. 关于SIO_RCVALL
  4. 软件测试有效性指标,评价软件测试的有效性
  5. 企业成长能力分析的指标是什么
  6. java井字棋编程的收获_Java 井字棋小结
  7. COS操作 java实现
  8. 美国加州伯克利大学计算机专业排名,美国加州大学伯克利分校计算机专业排名...
  9. 登录+注册界面的实现(代码)
  10. Life feelings--8--愉悦的做技术--将实验当做一种快乐