上一篇说到了 join,本篇就简单讲一讲对两个表做交、并、差运算。
并集
union 主要有两种用法:
- union:对前后两表求并集运算,如果有两条记录重复,则只保留一条。最后会对结果自动进行排序(小编目测根据两表当中的第一列数据进行排序),如果交换前后两表,union 之后结果是不变的。此外,如果要使用 order by 操作,只能写在后面一张表里。
顺带一提,个人使用 union 的时候,慢的一匹,不知道是不是排序的原因。如果有小伙伴知道,可以留言告诉我哦~
select id,name from t1
union select id,name from t2
union select id,name from t3 order by id;
- union all:对前后两表求并集运算,即便有两条记录重复,也全部都保留。最后不会对结果排序。(hive 中 union all 不支持顶层视图,可以用 select 包裹一下)
-- This is wrong
select id,name from t1
union all select id,name from t2;
-- The right post
select * from (
select id,name from t1
union all select id,name from t2
) t;
交集
在 sql 语句中,有 intersect 关键字。那么在hive 语句中,如何实现呢?
可以用 left outer join 或者更高效的left semi join 哦~
如何使用,可以参考我的上一篇文章,join 大法:https://www.jianshu.com/p/aac4a15a50c9
差集
在 sql 语句中,有 minus 关键字,但是 hive 暂时还不支持,那么问题来了,这回又要怎么办?
答案还是用 join 啦 ~
交集 和 差集 加在一起就是 上表的全部内容,那么我们在 left outer join 之后的 where 语句中,把对下表的 key 值判断由 is not null(即下表中该条数据存在,也就是交集) 换成 is null (下表中该条数据为 null ,也就是差集啦)即可~