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 |
    ...
    
相关推荐
PersistJiao1 小时前
在 Spark RDD 中,sortBy 和 top 算子的各自适用场景
大数据·spark·top·sortby
2301_811274311 小时前
大数据基于Spring Boot的化妆品推荐系统的设计与实现
大数据·spring boot·后端
Yz98761 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
青云交1 小时前
大数据新视界 -- 大数据大厂之 Hive 数据导入:多源数据集成的策略与实战(上)(3/ 30)
大数据·数据清洗·电商数据·数据整合·hive 数据导入·多源数据·影视娱乐数据
lzhlizihang1 小时前
python如何使用spark操作hive
hive·python·spark
武子康1 小时前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
武子康1 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
时差9531 小时前
Flink Standalone集群模式安装部署
大数据·分布式·flink·部署
锵锵锵锵~蒋1 小时前
实时数据开发 | 怎么通俗理解Flink容错机制,提到的checkpoint、barrier、Savepoint、sink都是什么
大数据·数据仓库·flink·实时数据开发
二进制_博客1 小时前
Flink学习连载文章4-flink中的各种转换操作
大数据·学习·flink