Hive数仓操作(九)

一、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 行
执行顺序:
  1. FROM

    • 确定数据来源,并建立数据范围。
  2. WHERE

    • 对数据进行筛选,剔除不符合条件的行。
  3. GROUP BY

    • 对数据进行分组,并进行聚合计算。
  4. HAVING

    • 在分组基础上进行进一步筛选。
  5. SELECT

    • 选择和计算输出的列。
  6. ORDER BY

    • 对结果集进行排序。
  7. 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 |
    ...
相关推荐
2601_962780911 小时前
2027校招准备:统计学专业如何用数据能力应聘企业经营管理管培生
大数据
阿明副业观察2 小时前
AI视频生成技术全解:生成方法、操作流程与选型指南
大数据·人工智能·ai作画·aigc·ai写作
Leo.yuan3 小时前
FineBI AI原生版:Agent主动规划分析路径,让数据成为企业经营决策的顾问
大数据
VibeCoding工程之道4 小时前
第八章 最终格局:不是 AI 淘汰人,是「依赖 AI 的人」淘汰自己
大数据·人工智能·ai焦虑·ai思考·ai反噬
大大大大晴天4 小时前
每天认识一个组件:Apache Kafka
大数据
2501_933670794 小时前
2027秋招岗位能力分组:数据科学与大数据技术专业如何组织技能与项目
大数据
野生数据人5 小时前
日志平台每日巡检我压成了一条命令链:从 SHOW BACKENDS 到扩缩容的完整步骤
大数据·数据库
liliangcsdn6 小时前
如何用DrissionPage进行网页自动化
大数据·自动化
野生数据人6 小时前
日志平台运维速查表:巡检命令、阈值、参数,一张贴墙
大数据·数据库
xiaogai_gai6 小时前
物料主数据从ERP同步到电商中台:基于轻易云的编码映射与增量全量双轨实践
大数据·数据库