一、Hive的DQL查询顺序
HQL语法基本上与传统的SQL一致,包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY和LIMIT等关键步骤
sql
SELECT * -- 1. 选择所有列
FROM employees -- 2. 数据来源是 employees 表
WHERE salary > 3000 -- 3. 筛选工资大于 3000 的行
GROUP BY department_id -- 4. 按 department_id 进行分组
HAVING AVG(salary) > 3500 -- 5. 筛选平均工资大于 3500 的分组
ORDER BY department_id -- 6. 按 department_id 排序
LIMIT 10; -- 7. 限制结果为前 10 行
执行顺序:
-
FROM
- 确定数据来源,并建立数据范围。
-
WHERE
- 对数据进行筛选,剔除不符合条件的行。
-
GROUP BY
- 对数据进行分组,并进行聚合计算。
-
HAVING
- 在分组基础上进行进一步筛选。
-
SELECT
- 选择和计算输出的列。
-
ORDER BY
- 对结果集进行排序。
-
LIMIT / OFFSET
- 截取部分结果进行输出。
二、Hive的排序方式
Hive有四种排序方式,也称为四个By
- Order By:全局排序,单个Reducer。
- Sort By:每个Reducer内部排序。
- Distribute By:根据字段哈希分配Reducer。
- Cluster By:分配和排序字段相同时使用。
1. Order By
-
全局排序,只能使用一个Reducer进行排序,一般公司会限制无法使用。
-
示例 :
sql-- 查询员工信息按工资升序排列 SELECT * FROM emp ORDER BY sal; -- 查询员工信息按工资降序排列 SELECT * FROM emp ORDER BY sal DESC;
-
注意:由于使用单个Reducer,效率较低。
2. Sort By
-
每个Reducer内部进行排序,但对全局来说结果无序。
-
示例 :
sql-- 设置Reducer个数 SET mapreduce.job.reduces=3; -- 根据部门编号降序查看员工信息 SELECT * FROM emp SORT BY empno; -- 将结果导入文件中(按部门编号降序排序) INSERT OVERWRITE LOCAL DIRECTORY '/opt/module/datas/sortby-result' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' SELECT * FROM emp SORT BY empno;
-
注意:需要提前设置Reducer数量。
3. Distribute By
-
将相同哈希的数据分配到同一个Reducer,对全局来说结果无序。
-
结合Sort By使用 :
sql-- 按部门编号分区,再按员工编号降序排序 SET mapreduce.job.reduces=3; SELECT * FROM emp DISTRIBUTE BY deptno SORT BY empno DESC; -- 格式化导出 INSERT OVERWRITE LOCAL DIRECTORY '/opt/module/datas/distribute-result' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' SELECT * FROM emp DISTRIBUTE BY deptno SORT BY empno DESC;
结果(按部门编号分区(类似于分桶的哈希算法)并按员工编号降序排序):
-
Reducer for deptno 10:
| empno | ename | deptno | sal | |-------|--------|--------|------| | 130 | Daniel | 10 | 3150 | | 127 | Aaron | 10 | 3800 | | 124 | Xavier | 10 | 3700 | ...
-
Reducer for deptno 20:
| empno | ename | deptno | sal | |-------|--------|--------|------| | 129 | Charlie| 20 | 2650 | | 126 | Zoe | 20 | 3950 | | 123 | Walt | 20 | 2500 | ...
-
Reducer for deptno 30:
| empno | ename | deptno | sal | |-------|--------|--------|------| | 128 | Betty | 30 | 4450 | | 125 | Yvonne | 30 | 4100 | ...
4. Cluster By
-
Distribute By和Sort By字段相同时等价,对全局来说结果无序。
-
排序只能升序不能指定DESC降序。
-
示例 :
sql-- 等价写法 SELECT * FROM emp CLUSTER BY deptno; SELECT * FROM emp DISTRIBUTE BY deptno SORT BY deptno;
结果(按部门编号分区并升序排序):
-
Reducer for deptno 10:
| empno | ename | deptno | sal | |-------|--------|--------|------| | 101 | Alice | 10 | 3000 | | 107 | Carol | 10 | 3500 | | 106 | Frank | 10 | 3200 | ...
-
Reducer for deptno 20:
| empno | ename | deptno | sal | |-------|--------|--------|------| | 102 | Bob | 20 | 4000 | | 105 | Eve | 20 | 2500 | ...
-
Reducer for deptno 30:
| empno | ename | deptno | sal | |-------|--------|--------|------| | 104 | Dave | 30 | 4500 | | 107 | Grace | 30 | 4800 | ...