目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现。

假设有一个用户浏览商品表skim,和一个用户购买商品表buy。如下

skim表

userId itemId time
001 342 2015-05-08
002 382 2015-05-09
003 458 2015-05-09
004 468 2015-05-09

buy表

userId itemId time
001 342 2015-05-07
002 382 2015-05-08
003 458 2015-05-09
005 325 2015-05-09

select * from skim left outer join buy 
on skim.userId = buy .userId and skim.itemId = buy .itemId 
结果如下:

skim.userId skim.itemId skim.time buy.userId buy.itemId buy.time
001 342 2015-05-08 001 342 2015-05-08
002 382 2015-05-09 002 382 2015-05-09
003 458 2015-05-09 003 458 2015-05-09
004 468 2015-05-09      

IN

如果要查询在skim表中并且也在buy表中的信息,需要用in查询,hive sql如下:

select skim.userId , skim.itemId from skim left outer join buy 
on skim.userId = buy .userId and skim.itemId = buy .itemId where buy .userId is not null;

结果如下:

userId itemId
001 342
002 382
003 458

NOT IN

如果要查询在skim表中并且不也在buy表中的信息,需要用not in查询,hive sql如下:

select skim.userId, skim.itemId from skim left outer join buy 
on skim.userId=buy .userId and skim.itemId=buy .itemId where buy .userId is null;

结果如下:

userId itemId
004 468

LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现。

Hive 当前没有实现 IN/EXISTS 子查询,所以你可以用 LEFT SEMI JOIN 重写你的子查询语句。LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在

ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。

SELECT a.key, a.value

FROM a

WHERE a.key in

(SELECT b.key

FROM B);

可以被重写为:

SELECT a.key, a.val

FROM a LEFT SEMI JOIN b on (a.key = b.key)

笛卡尔积

Hive本身是不支持笛卡尔积的,不能用select T1.*, T2.* from table_1, table_2这种语法。但有时候确实需要用到笛卡尔积的时候,可以用下面的语法来实现同样的效果:

select T1.*, T2.* from (select * from table1) T1 join (select * from table2) T2 on 1=1;

其中on 1=1是可选的,注意在Hive的Strict模式下不能用这种语法,需要先用set hive.mapred.mode=nonstrict;设为非strict模式就可以用了。

Hive 实现 IN 和 NOT IN 子句 和 LEFT SEMI JOIN 应用相关推荐

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

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

  2. Hive中HSQL中left semi join

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

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

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

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

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

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

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

  6. Hive中的in、exists和left semi join

    在hive sql开发的过程中,对于当前数据在另一个数据集合中,是否存在的判断有三种方式,一种是in ,一种是exists,另一种可以是left semi join,但是由于hive不支持in|not ...

  7. hive 的 left semi join 讲解

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

  8. Hive in、exists 和 left semi join

    with query1 as (select stack(4, 'A', 1, 'B', 2, 'C', 3, 'D', 4) as (k,v) ), query2 as (select stack( ...

  9. Hive中的left semi join和left anti join

    ​LEFT SEMI JOIN 这个大家应该知道的人相对少些,LEFT SEMI JOIN 只会返回匹配右表的数据,而且 LEFT SEMI JOIN 只会返回左表的数据,右表的数据是不会显示的 举例 ...

最新文章

  1. ubuntu下安装nagios
  2. C#连接mysql数据库的一个例子和获取本机IP的方法
  3. 圣母大学应用计算机数学统计,圣母大学(美国)应用、计算数学与统计学本科专业.pdf...
  4. 打游戏提示计算机丢失,Windows7电脑运行某游戏提示“计算机丢失mxvcp120.dll”怎么办...
  5. final 在java,final 在java中的注意点
  6. Yii2 源码分析 - 入口文件执行流程
  7. 编程三角形面积公式_利用边长计算三角形面积 — 海伦公式推导
  8. python下载_安装_配置_以及第一行python程序---python工作笔记009
  9. 数据分析只能当一辈子取数机?可能你缺少这个基础思维
  10. 总结这周学习的css的知识
  11. Veritas Backup Exec 21设置备份任务
  12. linux给文件夹图标,Linux 如何在启动器中自定义图标
  13. Python制作古诗生成器
  14. 初识Kinect之一
  15. Improved autoencoder for unsupervised anomaly detection
  16. 如何修改 gitlab 的项目名称
  17. 实验11-1-7 藏头诗 (15分)
  18. 创新科技成果广东功能性水稻品种 国稻种芯百团计划行动
  19. 超好用的网站推荐(持续更新)
  20. web前端开发笔试题

热门文章

  1. 爬虫3 requests基础2 代理 证书 重定向 响应时间
  2. 属性动画+购物车+结算
  3. 天视通支持海康威视摄像头吗_海康威视突然做电脑,到底有胜算吗?
  4. c语言创意程序题目,成都scratch趣味编程100例
  5. 解决chrome浏览器手机调试模式下鼠标指针消失(量化范围设置无效情况)
  6. matlab 改变坐标轴间距,matlab坐标轴刻度间距
  7. 让学前端不再害怕英语单词(三)
  8. iptables结合ipset禁止国外IP进行访问
  9. 谁是合约届「技术之王」?
  10. 《Windows 8 权威指南》——2.8 Metro版IE10,探测Windows 8 Metro应用的撒手锏