2020-03-23:hive的left semi join 例子

因为今天工作比较少,在看一些代码脚本,发现了一些不得了的东西,然后就来关注了简书,自己也开始觉得简书好像还不错,可以在这里记录一下自己所学的东西,俗话说好记性不如烂笔头,要学的东西还有很多,即使工作将近一年了,但是感觉自己还是有很多东西不会,相对于人家工作两年的时间就已经会这么多不得了的东西了,自己就莫名的觉得自己太菜鸡了,所以今天开始要每天都学习一些,然后在这里做下记录。

——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 语句,可以对比一下两个语句的区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容