Hive 实现 IN 和 NOT IN 子句 和 LEFT SEMI JOIN 应用
目前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 应用相关推荐
- Hive left semi join ,select 和 where中不能出现右表字段/不会生成笛卡尔积
1 left semi join的时间比in的时间短,比in高效 2 left semi join时select中不能出现右表的字段,不然报错 3 left semi join 时on中出现左表字 ...
- Hive中HSQL中left semi join
Hive中HSQL中left semi join 证明在Hive 2.1.1版本中,是支持where子句中的子查询,SQL常用的exist in子句在Hive中是不支持的,但可以使用一个更高效的实现方 ...
- hive 的 left semi join 讲解与left jion的区别
一:介绍 他们都是 hive join 方式的一种,join on 属于 common join(shuffle join/reduce join), 而 left semi join 则属于 map ...
- 【Hive】left semi join(exists、in)和 left join 区别
left semi join(exists.in)和 left join 区别 left semi join 基本认识 对比 执行计划 小结 left semi join 基本认识 LEFT SEMI ...
- Hive中的map join、left semi join和sort merge bucket join
map join map join是将join双方比较小的表直接分发到各个 map进程的内存中,在map进程中进行join操作,这样就不用进行reduce步骤,从而提高了速度. 如果不指定mapjoi ...
- Hive中的in、exists和left semi join
在hive sql开发的过程中,对于当前数据在另一个数据集合中,是否存在的判断有三种方式,一种是in ,一种是exists,另一种可以是left semi join,但是由于hive不支持in|not ...
- hive 的 left semi join 讲解
介绍 LEFT SEMI JOIN (左半连接)是 IN/EXISTS 子查询的一种更高效的实现. 示例 可以改写为 特点 1.left semi join 的限制是, JOIN 子句中右边的表只能在 ...
- 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( ...
- Hive中的left semi join和left anti join
LEFT SEMI JOIN 这个大家应该知道的人相对少些,LEFT SEMI JOIN 只会返回匹配右表的数据,而且 LEFT SEMI JOIN 只会返回左表的数据,右表的数据是不会显示的 举例 ...
最新文章
- ubuntu下安装nagios
- C#连接mysql数据库的一个例子和获取本机IP的方法
- 圣母大学应用计算机数学统计,圣母大学(美国)应用、计算数学与统计学本科专业.pdf...
- 打游戏提示计算机丢失,Windows7电脑运行某游戏提示“计算机丢失mxvcp120.dll”怎么办...
- final 在java,final 在java中的注意点
- Yii2 源码分析 - 入口文件执行流程
- 编程三角形面积公式_利用边长计算三角形面积 — 海伦公式推导
- python下载_安装_配置_以及第一行python程序---python工作笔记009
- 数据分析只能当一辈子取数机?可能你缺少这个基础思维
- 总结这周学习的css的知识
- Veritas Backup Exec 21设置备份任务
- linux给文件夹图标,Linux 如何在启动器中自定义图标
- Python制作古诗生成器
- 初识Kinect之一
- Improved autoencoder for unsupervised anomaly detection
- 如何修改 gitlab 的项目名称
- 实验11-1-7 藏头诗 (15分)
- 创新科技成果广东功能性水稻品种 国稻种芯百团计划行动
- 超好用的网站推荐(持续更新)
- web前端开发笔试题
热门文章
- 爬虫3 requests基础2 代理 证书 重定向 响应时间
- 属性动画+购物车+结算
- 天视通支持海康威视摄像头吗_海康威视突然做电脑,到底有胜算吗?
- c语言创意程序题目,成都scratch趣味编程100例
- 解决chrome浏览器手机调试模式下鼠标指针消失(量化范围设置无效情况)
- matlab 改变坐标轴间距,matlab坐标轴刻度间距
- 让学前端不再害怕英语单词(三)
- iptables结合ipset禁止国外IP进行访问
- 谁是合约届「技术之王」?
- 《Windows 8 权威指南》——2.8 Metro版IE10,探测Windows 8 Metro应用的撒手锏