当前位置: 首页 > article >正文

Hive SQL 中 BY 系列关键字全解析:从排序、分发到分组的核心用法

一、排序与分发相关 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表分区 / 窗口分组物理存储优化、窗口函数排名
http://www.lryc.cn/news/2395521.html

相关文章:

  • 数据类型检测有哪些方式?
  • 算法打开13天
  • Freeqwq 世界首个免费无限制 分布式 AI 算力平台 https://qwq.aigpu.cn/
  • 广告拦截器:全方位拦截,畅享无广告体验
  • .net Avalonia应用程序生命周期
  • 主数据编码体系全景解析:从基础到高级的编码策略全指南
  • Selenium操作指南(全)
  • Go语言中的数据类型转换
  • 35、请求处理-【源码分析】-自定义参数绑定原理
  • 智绅科技——科技赋能健康养老,构建智慧晚年新生态
  • STM32通过KEIL pack包轻松移植LVGL,并学会使用GUI guider
  • day43 python Grad-CAM
  • 在 Ubuntu 上挂载其他硬盘的步骤
  • SQL的查询优化
  • MCU如何从向量表到中断服务
  • 物联网基础概念
  • Linux线程同步实战:多线程程序的同步与调度
  • 【MySQL】事务及隔离性
  • Leetcode 3566. Partition Array into Two Equal Product Subsets
  • yolo目标检测助手:具有模型预测、图像标注功能
  • 传统数据表设计与Prompt驱动设计的范式对比:以NBA投篮数据表为例
  • 2022 RoboCom 世界机器人开发者大赛(睿抗 caip) -高职组(国赛)解题报告 | 科学家
  • WIN11 Docker Desktop 安装问题解决
  • 网站服务器出现异常的原因是什么?
  • Python实例题:Python3实现图片转彩色字符
  • 同一机器下通过HTTP域名访问其他服务器进程返回504问题记录
  • 基于物联网(IoT)的电动汽车(EVs)智能诊断
  • JDBC+HTML+AJAX实现登陆和单表的CRUD
  • Leetcode 3568. Minimum Moves to Clean the Classroom
  • Kafka多线程Consumer