一:介绍

他们都是 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的区别相关推荐

  1. hive 的 left semi join 讲解

    介绍 LEFT SEMI JOIN (左半连接)是 IN/EXISTS 子查询的一种更高效的实现. 示例 可以改写为 特点 1.left semi join 的限制是, JOIN 子句中右边的表只能在 ...

  2. 【Hive】left semi join(exists、in)和 left join 区别

    left semi join(exists.in)和 left join 区别 left semi join 基本认识 对比 执行计划 小结 left semi join 基本认识 LEFT SEMI ...

  3. join left semi_HIVE--left semi join

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

  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. hive之full outer join(全连接)使用方法

    目录 介绍 语法 例子 创建顾客表:customers 创建订单表:orders ?full outer join语句 ? left join + union + right join语句 介绍 fu ...

  6. Hive中HSQL中left semi join

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

  7. Hive left semi join ,select 和 where中不能出现右表字段/不会生成笛卡尔积

    1 left semi join的时间比in的时间短,比in高效 2 left semi join时select中不能出现右表的字段,不然报错 3  left semi  join 时on中出现左表字 ...

  8. Hive 实现 IN 和 NOT IN 子句 和 LEFT SEMI JOIN 应用

    目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现. 假设有一个用户浏览商品表skim,和一个用户购买商品表buy.如下 skim表 userId ite ...

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

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

最新文章

  1. python浏览上一句_python一句话启动http服务
  2. vue从入门到精通之进阶篇(三)axios
  3. Matlab快速入门
  4. 金融时报:人工智能在银行中的应用—对全球30家大型银行的调查
  5. 【项目管理】项目进度管理的关键路径
  6. (41)zabbix监控api接口性能及可用性 天气预报api为例
  7. 通用权限系统快速开发框架
  8. STM32程序下载1:通过keil-ST-Link方式下载
  9. h5策划书_一个成功的H5策划方案有哪些注意的点
  10. mysql 中电话号码_类型-电话号码和地址的mysql数据类型
  11. C1见习工程师(一)
  12. ABC162 D RGB Triplets
  13. px,dpi,分辨率,屏幕尺寸,dp 之间的关系
  14. Exp2 后门原理与实践 20164302 王一帆
  15. mysql sasl_SASL认证失败的原因(authentication failed)
  16. 【基础】603- 深入分析Session和Cookie
  17. 基本系统调用性能lmbench测试方法和下载
  18. 应用容器化之Kubernetes实践
  19. 太白金星的考验----python while循环的执着
  20. 加拿大存储厂商将在二战掩体中建设云数据中心

热门文章

  1. Android进阶:框架打造之IOC框架
  2. VC线程同步技术剖析
  3. SSL WSS HTTPS
  4. java同步队列_Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理
  5. 前端框架——Jquery——基础篇7__工具函数(Utils)
  6. 简述计算机的主要分类及应用领域,【内存分类及特点是什么】_简述计算机内存的分类及各自特点?...
  7. 高性能MySQL-3rd-(五)创建高性能索引
  8. 转一篇关于IIS用户权限的帖子
  9. ssh等价性的一些疑惑
  10. J2ME移动应用开发实战视频教程