一、Join
Hive 中的 Join 只支持等值 Join,也就是说 Join on 中的 on 里面表之间连接条件只能是 = ,不能是 <,> 等符号。此外,on中的等值连接之间只能是 and,不能是or。
Hive 执行引擎会将 HQL “翻译” 成为map-reduce 任务,在执行表的 Join 操作时,如果多个表中每个表都使用同一个列进行连接(出现在 Join on 子句中),则只会生成一个 MR Job:
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)
三个表 a、b、c 都分别使用了同一个字段进行连接,亦即同一个字段同时出现在两个 Join 子句中,从而只生成一个 MR Job。
如果多表中,其中存在一个表使用了至少 2 个字段进行连接(同一个表的至少2个列出现在 Join 子句中),则会至少生成 2 个MR Job:
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
三个表基于 2 个字段进行连接,这两个字段 b.key1 和 b.key2 同时出现在 b 表中。连接的过程是这样的:首先 a 和 b 表基于a.key 和 b.key1 进行连接,对应着第一个 MR Job;表 a 和 b 连接的结果,再和 c 进行连接,对应着第二个 MR Job。
这是因为 Map 输出时候以 Join on 条件中的列为 key,如果 Join 有多个关联键,则以这些关联键的组合作为 key,Map 根据 Key 分发数据给 Reduce 端,具体的 Join 是在 Reduce 操作中完成,因此,如果多表基于不同的列做 Join,则无法在一轮 MR 任务中将所有相关数据 shuffle 到同一个 Reduce 操作中。
二、Join 类型
Hive 支持常用的 SQL Join 语句,例如内连接、左外连接、右外连接以及 Hive 独有的 map 端连接。其中 map 端连接是用于优化 Hive 连接查询的一个重要技巧。
先准备三张表。
employee员工表:
create table if not exists employee(
user_id int,
username string,
dept_id int)
row format delimited
fields terminated by ' '
lines terminated by '\n';
dept部门表:
create table if not exists dept(
dept_id int</