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;
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。