本文共 1068 字,大约阅读时间需要 3 分钟。
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;
查询结果:
转载地址:http://bgjxi.baihongyu.com/