Hive支持通常的SQL JOIN语句,但是只支持等值连接。
1.1、INNER JOIN
只有进行连接的两个表都存在与连接标准相匹配的数据才会保存下来

select a.ymd a.price b.price
from stocks a JOIN stocks b on a.ymd=b.ymd
where a.symbol='DELL' and b.symbol='HP';

ON子句表示了两个表数据进行连接的条件。WHERE子句限制了左边表必须是DELL表右边表必须是HP表。

select a.ymd a.price b.price
from stocks a JOIN stocks b on a.ymd<=b.ymd
where a.symbol='DELL' and b.symbol='HP';

如上语句在Hive中是违法的,主要是因为通过mapreduce很难实现这种连接,不过pig提高了一个交叉生产的功能,所以在pig中可以实现。同时在Hive中不支持在ON子句中的谓词间使用OR

select a.ymd a.price b.price c.price
from stocks a JOIN stocks b on a.ymd=b.ymd
              JOIN stocks c on a.ymd=c.ymd
where a.symbol='DELL' and b.symbol='HP' and c.symbol='lenovo';

两张以上的表采用如上形式进行连接,mapreduce job会先对表a和表b进行连接操作,然后再启动一个mapreduce job将第一个job的输出与c连接。
1.2、JOIN优化
连续查询的表大小从左到右依次增加。
1.3、left outer join
左外连接操作中,join操作符左边表中符合where子句的所有记录会被返回。join操作符右边表如果没有符合on后面连接条件的记录时,那么右边表指定选择的列的值将为NULL,再整个过程中会先执行join,然后where再继续过滤。
1.4、right outer join
右外连接会返回右边表所有符合where语句的记录,左边表匹配不上的用NULL代替。
1.5、FULL OUTER JOIN
完全外连接会返回所有表中符合where语句条件的所有记录,如果任一指定字段没有符合条件的值,用NULL代替。
1.6、LEFT SEMI-JOIN
左半开连接会返回左边表的记录,前提是其记录对于右边表满足ON的判断条件。左半开连接是一种优化了的内连接。hive不支持右半开连接!!!
1.7、笛卡儿积连接
笛卡尔积连接表示左边表的行数乘以右边表的行数,如左边表5行数据,右边表6行数据,产生的结果就是30行数据,笛卡尔积连接会产生大量的数据,且不是并发执行,无法优化。不过在推荐系统中非常有用。