hive 之 join 大法

  hive 当中可以通过 join 和 union 两种方式合并表,其中 join 偏向于横向拼接(增加列的数量),union 则主要负责纵向拼接(增加行的数量)。本文先讲解一下 join。

  hive 中 join 主要分为六种,join、left (outer) join、right (outer) join、full (outer) join、cross join 和 left semi join。
  切记,使用 join 时不能忘记关键字 on。如果结尾未写 on,则都相当于进行 cross join,笛卡儿积关联(左表一万条数据,右表一万条数据,笛卡儿积之后就是一亿条数据,可怕吧~)。
  附注一句,join 中将大表写在靠右的位置,hive 处理速度也会快一些~

讲解

  • join :内连接,返回两张表都有的数据。
  • left outer join :左连接,以前面的表为主表,返回的数据行数跟主表相同,关联不上的字段为NULL。
  • right outer join:右连接,以后面的表为主表,返回的记录数和主表一致,关联不上的字段为NULL。
  • full outer join:全连接,返回两个表的并集,空缺的字段为NULL。
  • cross join: 返回两个表的笛卡尔积结果(数目为左表乘右表),不需要指定关联键。
  • left semi join: 并不拼接两张表,两个表对 on 的条件字段做交集,返回前面表的记录,相较于其他的方法,这样子 hive 处理速度比较快。

hive 中不支持 where 语句的子查询。如下sql 语句在 hive 中是要凉凉的:

SELECT a.key, a.value FROM a 
WHERE a.key in (SELECT b.key FROM B);

改写其实也很简单:

SELECT a.key, a.value
FROM a LEFT OUTER JOIN b ON (a.key = b.key)
WHERE b.key <> NULL;

那么更加高效的 semi 写法是怎样的呢?

SELECT a.key, a.val
FROM a LEFT SEMI JOIN b ON (a.key = b.key);

ok,今天就先讲到这里,谢谢各位看官阅读~

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