Hive三大连接操作全解析
Hive中的连接操作详解
1. 全连接(FULL JOIN)
- 作用:返回两个表的所有记录,匹配失败时用
NULL填充缺失部分 - 语法:
SELECT * FROM table1 FULL JOIN table2 ON table1.key = table2.key - 示例:
-- 员工表(emp)和部门表(dept)的全连接 SELECT emp.name, dept.dept_name FROM emp FULL JOIN dept ON emp.dept_id = dept.id - 结果特征:
- 包含所有员工(即使无部门)
 - 包含所有部门(即使无员工)
 - 缺失值显示为
NULL 
 
2. 半连接(SEMI JOIN)
- 作用:仅返回左表中存在于右表的记录(不返回右表字段)
 - 语法:
SELECT * FROM table1 LEFT SEMI JOIN table2 ON table1.key = table2.key - 示例:
-- 获取有订单的客户 SELECT cust.* FROM customers cust LEFT SEMI JOIN orders ON cust.id = orders.cust_id - 结果特征:
- 只返回左表字段
 - 相当于
WHERE EXISTS子查询 - 右表字段不可访问
 
 
3. 交叉连接(CROSS JOIN)
- 作用:生成两个表的笛卡尔积(所有行组合)
 - 语法:
SELECT * FROM table1 CROSS JOIN table2 - 示例:
-- 生成所有产品与地区的组合 SELECT products.name, regions.region_name FROM products CROSS JOIN regions - 结果特征:
- 结果行数 = $m \times n$($m$为左表行数,$n$为右表行数)
 - 无连接条件
 - 大数据集需谨慎使用(易产生海量数据)
 
 
核心对比
| 连接类型 | 匹配逻辑 | 结果特征 | 典型应用场景 | 
|---|---|---|---|
| FULL JOIN | 保留所有记录+NULL填充 | 包含两表全部数据 | 数据完整性分析 | 
| SEMI JOIN | 仅保留左表匹配记录 | 只返回左表字段 | 存在性验证(如过滤) | 
| CROSS JOIN | 所有行组合(笛卡尔积) | $m \times n$ 行结果 | 组合生成(如测试用例构建) | 
性能提示:
- 优先使用
 SEMI JOIN替代IN/EXISTS子查询(Hive优化更好)CROSS JOIN需严格控制数据量(可添加WHERE 1=0快速终止)- 大表连接建议开启MapJoin优化:
 SET hive.auto.convert.join=true;
