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,今天就先讲到这里,谢谢各位看官阅读~