hive 之 交、并、差 探析

上一篇说到了 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 ,也就是差集啦)即可~

    原文作者:大王叫我来巡老和山
    原文地址: https://www.jianshu.com/p/bce61314c568
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞