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

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

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

skim表

userIditemIdtime
0013422015-05-08
0023822015-05-09
0034582015-05-09
0044682015-05-09

buy表

userIditemIdtime
0013422015-05-07
0023822015-05-08
0034582015-05-09
0053252015-05-09

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

skim.userIdskim.itemIdskim.timebuy.userIdbuy.itemIdbuy.time
0013422015-05-080013422015-05-08
0023822015-05-090023822015-05-09
0034582015-05-090034582015-05-09
0044682015-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;

结果如下:

userIditemId
001342
002382
003458

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;

结果如下:

userIditemId
004468

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模式就可以用了。



  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值