因为今天工作比较少,在看一些代码脚本,发现了一些不得了的东西,然后就来关注了简书,自己也开始觉得简书好像还不错,可以在这里记录一下自己所学的东西,俗话说好记性不如烂笔头,要学的东西还有很多,即使工作将近一年了,但是感觉自己还是有很多东西不会,相对于人家工作两年的时间就已经会这么多不得了的东西了,自己就莫名的觉得自己太菜鸡了,所以今天开始要每天都学习一些,然后在这里做下记录。
——SQL中 where in 的用法
首先我们要知道where是什么:一个判断符。在SQL操作中,控制只选择指定的行。
in的其实归类于特殊的比较运算符
expr1 in(expr2,expr3,expr4,…)表示expr1等于后面括号里面的任意一个表达式的值
下面在sql中做举例:查询id在(1,2,3)内的数据行,得到下面的结果:
(其中如果where的字段为字符串类型,in后面的的值需要加上引号)
——hive中left semi join相当于SQL中的where in语句
left semi join(左半连接)是 in/exsits 子查询的一种更高效的实现
示例:
select A.key,A.value from A where A.key in (select B.key from A);
可以改写成:
select A.key,A.value from A left semi join B on (A.key=B.key);
left semi join的一些特点:(根据网上参考的总结,后续看到会继续补充)
1、left semi join 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。
2、left semi join 是只传递表的 join key 给 map 阶段,因此left semi join 中最后 select 的结果只许出现左表。
3、因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过,而 join 则会一直遍历。这就导致右表有重复值得情况下 left semi join 只产生一条,join 会产生多条,也会导致 left semi join 的性能更高。
比如以下A表和B表进行 join 或 left semi join,然后 select 出所有字段,结果区别如下:
注:蓝色叉的那一列实际是不存在left semi join中的,因为最后 select 的结果只许出现左表。
ps:
下次在hive用到join联表的时候换成 left semi join 语句,可以对比一下两个语句的区别