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 |
    ...
    
相关推荐
Acrelhuang4 分钟前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
皓74113 分钟前
服饰电商行业知识管理的创新实践与知识中台的重要性
大数据·人工智能·科技·数据分析·零售
Mephisto.java15 分钟前
【大数据学习 | kafka高级部分】kafka的kraft集群
大数据·sql·oracle·kafka·json·hbase
Mephisto.java17 分钟前
【大数据学习 | kafka高级部分】kafka的文件存储原理
大数据·sql·oracle·kafka·json
消失在人海中1 小时前
数据仓库之 Atlas 血缘分析:揭示数据流奥秘
数据仓库
Hsu_kk1 小时前
Hive 查询用户连续三天登录的所有记录
数据仓库·hive·hadoop
ycsdn101 小时前
Caused by: org.apache.flink.api.common.io.ParseException: Row too short:
大数据·flink
DolphinScheduler社区2 小时前
Apache DolphinScheduler + OceanBase,搭建分布式大数据调度平台的实践
大数据
时差9533 小时前
MapReduce 的 Shuffle 过程
大数据·mapreduce
kakwooi4 小时前
Hadoop---MapReduce(3)
大数据·hadoop·mapreduce