一、排序與分發相關 BY 關鍵字
1. ORDER BY:全局統一排序
作用:對查詢結果進行全局排序,確保最終結果集完全有序(僅允許單個 Reducer 處理數據)。
語法:
SELECT * FROM table_name ORDER BY column1 [ASC|DESC]; -- ASC 為默認升序
特點:
大數據量時性能較差(單節點壓力大),適用于需要絕對有序的場景(如總分排名、全量數據排序)。
2. SORT BY:分區內局部排序
作用:在每個 Reducer 內部對數據排序,不同 Reducer 間結果可能無序。
語法:
SELECT * FROM table_name SORT BY column1 [ASC|DESC];
特點:數據先按分發規則(如?DISTRIBUTE BY
)分配到多個 Reducer,再獨立排序,性能優于?ORDER BY
。
3. DISTRIBUTE BY:數據分發規則指定
作用:定義數據分發到 Reducer 的規則,相同值的記錄會被分配到同一個 Reducer。
典型搭配:與?SORT BY
?聯用,實現 “先分發后排序”(分區內排序)。
語法:
SELECT * FROM table_name DISTRIBUTE BY column1 SORT BY column2 [ASC|DESC];
示例:按?user_id
?分發數據到同一 Reducer,再按?log_time
?排序:
SELECT * FROM logs DISTRIBUTE BY user_id SORT BY log_time ASC;
4. CLUSTER BY:分發與排序的語法糖
作用:等價于?DISTRIBUTE BY column AND SORT BY column
,對同一字段同時進行分發和排序。
語法:
SELECT * FROM table_name CLUSTER BY column;
限制:僅能對單一字段操作,無法對不同字段分別設置分發和排序規則。
二、分組與聚合相關 BY 關鍵字
5. GROUP BY:數據分組與聚合
作用:按指定字段對數據分組,配合聚合函數(如 SUM、COUNT、AVG)?進行統計計算。
語法:
SELECT group_col, aggregate_func(column)
FROM table_name
GROUP BY group_col;
示例:統計各部門員工人數及平均工資:
SELECT dept_id, COUNT(*) AS emp_count, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id;
注意:未在聚合函數中的字段需出現在?GROUP BY
?子句中(Hive 3.0+ 支持優化)。
6. PARTITION BY:分區與窗口分組
場景一:Hive 表分區(物理存儲)
作用:將數據按字段存儲在不同目錄(如按日期、地域分區),提升查詢效率。
語法:
CREATE TABLE sales_data (order_id INT, amount DECIMAL)
PARTITIONED BY (year STRING, month STRING);
過濾分區字段時可直接定位文件,如?SELECT * FROM sales_data WHERE year='2023'
。
場景二:窗口函數(邏輯分組)
作用:在查詢結果中按字段分組,不改變行數,用于計算分組內排名、累計值等。
語法:
SELECT *, ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rank
FROM employees;
說明:按?dept_id
?分組,計算每個員工在部門內的工資排名。
三、關鍵特性對比表
關鍵字 | 核心功能 | 是否改變數據行數 | 典型場景 |
---|---|---|---|
ORDER BY | 全局排序 | 否 | 全量數據排名、總決賽計分 |
SORT BY | 分區內排序 | 否 | 日志分區內時間排序 |
DISTRIBUTE BY | 數據分發到 Reducer 的規則 | 否 | 配合 SORT BY 實現分區內排序 |
CLUSTER BY | 分發 + 排序(同字段) | 否 | 簡單場景下的快速排序分發 |
GROUP BY | 分組聚合 | 是(聚合后行數減少) | 部門統計、類別匯總 |
PARTITION BY | 表分區 / 窗口分組 | 否 | 物理存儲優化、窗口函數排名 |