1.Reduce Join操作
Reduce Join,也叫Common Join、Shuffle Join。Reduce操作就是在Reduce阶段完成Join操作,该操作包括一个完成的MapRedue过程,即需要经历Map阶段、Shuffle阶段、Reduce阶段。
Map阶段:该阶段输出的时候以Join On 条件中的列为key,如果Join On中涉及到多个键,则以这些关联键的组合为key。Map输出的列为Join之后所关心的键,即Select语句和Where语句中涉及到的列。为了区分value数据的来源,还需要在value中加一个Tag信息,表明数据来源。
Shuffle阶段:混洗阶段。主要是根据Map阶段产生的Key值对数据进行hash分组,将Key/Value按照hash值推动到不同的Reduce阶段。
Reduce阶段:完成Join操作。
2.Map Join操作
如果进行Join操作的两张表中有一张表比较小,完全可以直接保存在内存里,则这个时候会默认进行Map Join操作。至于表要多小才能启动Map Join操作,可以通过hive.mapjoin.smalltable.filesize设置(一般默认为25M)。既然叫Map Join也就是说,Join操作是在Map阶段完成的,不需要Shuffle阶段和Reduce阶段。能提高Join效率并节省资源。
Map Join的工作原理就是将小表读入到内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配。
另外,Map Join可以进行不等值的连接操作。但是Map Join不适合FULL/RIGHT OUTER JOIN
3.各种join操作问题
3.1 内连接和外连接
使用外连接的一个好处就是可以将对于连接条件不成立的记录仍然包含在最后的结果中。 具体的外连接包括左外连接、右外连接和全外连接。
3.2 等值连接和不等值连接
Hive中不支持On条件上使用不等值连接,所以一般的常用做法就是讲两张表先进行笛卡尔连接然后在where子句中使用不等值条件进行筛选。
3.3 左半连接
由于左半连接只会返回左边表的记录,在其他数据库的SQL查询语句中的通常会使用IN EXISTS结构来处理这种情况。在使用左半连接的时候,SELECT 和Where子句中不能引用到右表中的字段。另外,对于坐标中一条指定的记录,在右边表中一旦找到匹配的记录,Hive就会立即停止扫描。而其他Join操作则仍然会扫描全表。