左半开连接(left semi join)

1.left semi join 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。

例子:

 select * from person g left semi join exptest t on g.name = t.name where g.name='wang'; --语句可以查询,因为where g.name='wang'; 用到时左表。

select * from person g left semi join exptest t on g.name = t.name where t.name='wang';--语句报错,因为 t.name='wang';是右边表

FAILED: Execution Error, return code 130 from org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask

2.对待右表中重复key的处理方式差异:因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过,而 join on 则会一直遍历。最后的结果是这会造成性能,以及 join 结果上的差异。

例子:

person 表的数据:

1 wang ["lol","data2"]

2 tom ["跳槽"]

3 Jack ["得分","阿斯蒂芬","大师傅"]

4 jim ["登陆","饿啊分"]

exptest表的数据

hive (hive)> select * from exptest;

OK

exptest.id exptest.name exptest.likes

1 wang ["lol","data2"]

1 wang ["lol","data2"]

select * from person g  join exptest t on g.name = t.name;

查询结果:

 

select * from person g left semi join exptest t on g.name = t.name;

查询结果:

 

(4)left semi join 中最后 select 的结果只许出现左表,因为右表只有 join key 参与关联计算了,而 join on 默认是整个关系模型都参与计算了。​​​​​​​

select * from person g left semi join exptest t on g.name = t.name;

查询结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值