左半开连接(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;

查询结果:

左半开连接(left semi join)_第1张图片

 

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;

查询结果:

 

你可能感兴趣的:(hive)