推荐答案
在 Hive 中,支持的 JOIN 类型包括:
- INNER JOIN:返回两个表中满足连接条件的记录。
- LEFT OUTER JOIN:返回左表中的所有记录,以及右表中满足连接条件的记录。如果右表中没有匹配的记录,则返回 NULL。
- RIGHT OUTER JOIN:返回右表中的所有记录,以及左表中满足连接条件的记录。如果左表中没有匹配的记录,则返回 NULL。
- FULL OUTER JOIN:返回左表和右表中的所有记录。如果某一边没有匹配的记录,则返回 NULL。
- LEFT SEMI JOIN:返回左表中与右表匹配的记录,但只返回左表的字段。
- CROSS JOIN:返回两个表的笛卡尔积,即左表中的每一行与右表中的每一行组合。
- MAP JOIN:适用于小表与大表连接的情况,Hive 会将小表加载到内存中,以提高连接性能。
本题详细解读
INNER JOIN
INNER JOIN 是最常用的 JOIN 类型,它只返回两个表中满足连接条件的记录。如果左表或右表中没有匹配的记录,则这些记录不会出现在结果集中。
SELECT a.*, b.* FROM table_a a INNER JOIN table_b b ON a.key = b.key;
LEFT OUTER JOIN
LEFT OUTER JOIN 返回左表中的所有记录,即使右表中没有匹配的记录。如果右表中没有匹配的记录,则右表的字段将返回 NULL。
SELECT a.*, b.* FROM table_a a LEFT OUTER JOIN table_b b ON a.key = b.key;
RIGHT OUTER JOIN
RIGHT OUTER JOIN 返回右表中的所有记录,即使左表中没有匹配的记录。如果左表中没有匹配的记录,则左表的字段将返回 NULL。
SELECT a.*, b.* FROM table_a a RIGHT OUTER JOIN table_b b ON a.key = b.key;
FULL OUTER JOIN
FULL OUTER JOIN 返回左表和右表中的所有记录。如果某一边没有匹配的记录,则返回 NULL。
SELECT a.*, b.* FROM table_a a FULL OUTER JOIN table_b b ON a.key = b.key;
LEFT SEMI JOIN
LEFT SEMI JOIN 返回左表中与右表匹配的记录,但只返回左表的字段。它类似于 EXISTS 子查询。
SELECT a.* FROM table_a a LEFT SEMI JOIN table_b b ON a.key = b.key;
CROSS JOIN
CROSS JOIN 返回两个表的笛卡尔积,即左表中的每一行与右表中的每一行组合。这种 JOIN 类型通常用于生成所有可能的组合。
SELECT a.*, b.* FROM table_a a CROSS JOIN table_b b;
MAP JOIN
MAP JOIN 适用于小表与大表连接的情况。Hive 会将小表加载到内存中,以提高连接性能。MAP JOIN 可以通过设置 hive.auto.convert.join=true
来自动启用。
SELECT /*+ MAPJOIN(b) */ a.*, b.* FROM table_a a JOIN table_b b ON a.key = b.key;