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

Apache Hive--排序函数解析

在大数据处理与分析中,Apache Hive是一个至关重要的数据仓库工具。其丰富的函数库为数据处理提供了诸多便利,排序函数便是其中一类非常实用的工具。通过排序函数,我们能够在查询结果集中为每一行数据分配一个排名值,这对于数据分析、报表生成等工作具有重要意义。本文将深入探讨Apache Hive中的排序函数,通过具体的HQL代码和数据实例进行说明,并阐述它们之间的区别。

0. 排序函数:ORDER、SORT、CLUSTER

ORDER BY

  1. 功能ORDER BY 会对整个数据集按照指定的列进行全局排序,确保最终输出的结果是完全有序的。
  2. 代码示例
    假设我们有之前创建的 student_scores 表,包含 student_name(学生姓名)和 score(成绩)字段。
SELECT student_name, score
FROM student_scores
ORDER BY score DESC;
  1. 结果展示
student_namescore
David95
Bob90
Cathy90
Alice85
Charlie85

整个结果集按照成绩从高到低进行了全局排序。

SORT BY

  1. 功能SORT BY 用于在每个Reducer内对数据进行排序。它不会对整个数据集进行全局排序,而是在每个Reducer的分区内进行排序,在处理大规模数据时可提高处理效率。
  2. 代码示例
SET mapreduce.job.reduces = 3; -- 设置Reducer数量为3
SELECT student_name, score
FROM student_scores
SORT BY score DESC;
  1. 结果展示
    由于 SORT BY 是在每个Reducer内排序,结果会根据Reducer的处理情况而有所不同。假设每个Reducer处理的数据如下(实际情况可能因数据分配方式不同而不同):
  • Reducer 1
student_namescore
David95
  • Reducer 2
student_namescore
Bob90
Cathy90
  • Reducer 3
student_namescore
Alice85
Charlie85

每个Reducer内的数据按成绩降序排列,但整体结果集并非全局有序。

CLUSTER BY

  1. 功能CLUSTER BY 用于对数据进行分桶操作,它会根据指定的列对数据进行哈希运算,将数据均匀分布到不同的桶(bucket)中,同时在每个桶内对数据按指定列进行排序。这在数据量较大时,有助于提升查询性能,特别是在进行连接(join)操作以及与排序相关的操作时。
  2. 代码示例
-- 创建按score分桶的学生成绩表
CREATE TABLE student_scores_clustered (student_name STRING,score INT
)
CLUSTERED BY (score) INTO 2 BUCKETS;-- 将数据插入到分桶表
INSERT INTO TABLE student_scores_clustered
SELECT student_name, score
FROM student_scores;-- 查询分桶表
SELECT student_name, score
FROM student_scores_clustered;
  1. 结果展示
    数据会根据 score 列的哈希值分配到不同的桶中,并且在每个桶内按 score 排序。假设分桶结果如下(实际情况可能因哈希算法和数据分布不同而不同):
  • Bucket 1
student_namescore
David95
Bob90
Cathy90
  • Bucket 2
student_namescore
Alice85
Charlie85

每个桶内的数据按 score 排序。

小结

ORDER BY 用于全局排序,适用于需要最终结果完全有序的场景,但处理大数据时性能可能较低。
SORT BY 在每个 Reducer 内排序,适用于大规模数据处理,提高处理效率,但不保证全局有序。
CLUSTER BY 进行分桶并在桶内排序,主要用于优化特定查询(如 join)的性能,同时结合了分桶和局部排序的功能。

1. ROW_NUMBER窗口函数

1.1 功能概述

ROW_NUMBER窗口函数为结果集中的每一行分配一个唯一的连续排名值,从1开始,按照ORDER BY子句指定的顺序递增。无论数据值是否相同,其排名都不会出现重复,且是连续的。

1.2 代码示例

假设有一个学生成绩表student_scores,包含student_name(学生姓名)和score(成绩)字段:

CREATE TABLE student_scores (student_name STRING,score INT
);INSERT INTO student_scores VALUES
('Alice', 85),
('Bob', 90),
('Cathy', 90),
('Charlie', 85),
('David', 95);

使用ROW_NUMBER函数对学生成绩进行排名的查询如下:

SELECTstudent_name,score,ROW_NUMBER() OVER (ORDER BY score DESC) AS rank
FROMstudent_scores;

上述代码中,ROW_NUMBER() OVER (ORDER BY score DESC)表示按照score降序排列,为每一行数据分配一个唯一的排名。

1.3 结果展示

执行上述查询后,结果如下:

student_namescorerank
David951
Bob902
Cathy903
Alice854
Charlie855

2. RANK窗口函数

2.1 功能概述

RANK窗口函数同样用于为结果集的行分配排名。但当遇到相同值时,会分配相同的排名,并且下一个排名会跳过相应的数量。例如,如果有两个并列第2名,那么下一个排名将是第4名。

2.2 代码示例

仍以上述student_scores表为例,使用RANK函数进行排名的查询为:

SELECTstudent_name,score,RANK() OVER (ORDER BY score DESC) AS rank
FROMstudent_scores;

2.3 结果展示

执行该查询后,结果如下【相同分数的排名是随机的】:

student_namescorerank
David951
Bob902
Cathy902
Alice854
Charlie854

可以看到,Bob和Cathy成绩相同,排名都是2,下一个排名直接跳到了4。

3. DENSE_RANK窗口函数

3.1 功能概述

DENSE_RANK窗口函数也用于排名,与RANK函数不同之处在于,当遇到相同值时,虽然也会分配相同的排名,但下一个排名不会跳过。即即使有并列情况,排名依然是连续的。

3.2 代码示例

还是针对student_scores表,使用DENSE_RANK函数排名的查询为:

SELECTstudent_name,score,DENSE_RANK() OVER (ORDER BY score DESC) AS rank
FROMstudent_scores;

3.3 结果展示

执行查询后,结果如下【相同分数的排名是随机的】:

student_namescorerank
David951
Bob902
Cathy902
Alice853
Charlie853

这里Bob和Cathy并列第2名,下一个排名是第3名,没有跳过。

结合partition by 进行使用实现组内排序

在 Apache Hive 中,PARTITION BY 子句与排序窗口函数结合使用时,会先将数据按照指定的列进行分区,然后在每个分区内分别应用排序函数。这在处理需要分区统计排名的场景中非常有用。
ROW_NUMBER 窗口函数结合 PARTITION BY
功能说明:在每个分区内,ROW_NUMBER 函数为每一行分配一个唯一的连续排名值,从 1 开始,按照 ORDER BY 子句指定的顺序递增。不同分区之间的排名相互独立。
代码示例:假设 student_scores 表新增 class(班级)字段,现在要查询每个班级内学生成绩的排名。

-- 创建包含班级字段的学生成绩表
CREATE TABLE student_scores (student_name STRING,score INT,class STRING
);-- 插入数据
INSERT INTO student_scores VALUES
('Alice', 85, 'Class1'),
('Bob', 90, 'Class1'),
('Charlie', 85, 'Class2'),
('David', 95, 'Class2');-- 使用ROW_NUMBER函数结合PARTITION BY查询
SELECTstudent_name,score,class,ROW_NUMBER() OVER (PARTITION BY class ORDER BY score DESC) AS rank
FROMstudent_scores;

结果展示:

student_namescoreclassrank
Bob90Class11
Alice85Class12
David95Class21
Charlie85Class22

在这个结果中,PARTITION BY class 将数据按班级分为 Class1 和 Class2 两个分区,ROW_NUMBER 函数在每个分区内分别对学生成绩进行排名。
RANK 窗口函数结合 PARTITION BY
功能说明:与 ROW_NUMBER 类似,不过在每个分区内,当遇到相同值时,RANK 函数会分配相同的排名,并且下一个排名会跳过相应的数量。
代码示例:

SELECTstudent_name,score,class,RANK() OVER (PARTITION BY class ORDER BY score DESC) AS rank
FROMstudent_scores;

结果展示:

student_namescoreclassrank
Bob90Class11
Alice85Class12
David95Class21
Charlie85Class22

同样,在每个班级分区内,按照成绩排名,相同成绩的学生排名相同,下一个排名会跳过相应数量。
DENSE_RANK 窗口函数结合 PARTITION BY
功能说明:在每个分区内,DENSE_RANK 函数遇到相同值时也会分配相同的排名,但下一个排名不会跳过,保持排名的连续性。
代码示例:

SELECTstudent_name,score,class,DENSE_RANK() OVER (PARTITION BY class ORDER BY score DESC) AS rank
FROMstudent_scores;

结果展示:

student_namescoreclassrank
Bob90Class11
Alice85Class12
David95Class21
Charlie85Class22

在每个班级分区内,排名是连续的,即使有相同成绩的学生,下一个排名也不会跳过。

小结

  • ROW_NUMBER:分配唯一且连续的排名,无论数据值是否重复,排名都不会间断。
  • RANK:相同数据值分配相同排名,下一个排名会跳过相应数量,导致排名可能不连续。
  • DENSE_RANK:相同数据值分配相同排名,但下一个排名不会跳过,排名始终连续。

排序函数的优化

在Apache Hive中优化排序函数的性能,可从以下几个关键方面着手:

1. 数据预处理

  • 数据过滤:在使用排序函数前,尽量通过WHERE子句对数据进行过滤,减少参与排序的数据量。例如,在上述student_scores表中,如果我们只关心成绩大于80分的学生排名,可在查询中添加WHERE条件:
SELECTstudent_name,score,ROW_NUMBER() OVER (ORDER BY score DESC) AS rank
FROMstudent_scores
WHEREscore > 80;
  • 数据抽样:对于大规模数据集,可先进行抽样处理,对抽样数据进行排序分析,获取大致结果。这在对数据整体趋势有初步了解时很有用。比如,从海量销售数据中抽取1%的数据来分析销售排名趋势。

2. 合理使用分区

  • 分区表设计:将数据按合适的列进行分区,可显著提高排序性能。比如,在销售数据中,按日期分区,查询某段时间内的销售排名时,Hive可直接在相关分区内操作,减少扫描的数据量。
-- 创建按日期分区的销售表
CREATE TABLE sales (product STRING,quantity INT
)
PARTITIONED BY (sale_date STRING);
  • 分区裁剪:查询时,Hive会自动进行分区裁剪,只读取相关分区的数据。例如:
SELECTproduct,quantity,RANK() OVER (ORDER BY quantity DESC) AS rank
FROMsales
WHEREsale_date BETWEEN '2023-01-01' AND '2023-01-31';

3. 选择合适的排序函数

  • 根据业务需求:明确业务场景对排名的具体要求,合理选择ROW_NUMBERRANKDENSE_RANK。如果需要唯一且连续的排名,ROW_NUMBER是最佳选择;若允许并列排名且排名可间断,RANK更合适;若要并列排名且排名连续,DENSE_RANK是正确之选。避免因错误选择函数导致不必要的计算。
  • 函数性能差异:虽然这三个排序函数在功能上有差异,但性能差异相对较小。不过,ROW_NUMBER由于不需要处理并列排名情况,在数据量极大且无并列值的情况下,理论上可能会稍快一些。

4. 配置参数调整

  • 内存分配:适当增加Hive任务的内存分配,可使排序操作更高效。通过修改hive-site.xml文件中的相关参数,如mapreduce.map.memory.mbmapreduce.reduce.memory.mb,为排序操作提供足够内存。
  • 并行度调整:合理调整MapReduce任务的并行度,可充分利用集群资源。例如,根据集群节点数量和数据量,设置mapreduce.job.mapsmapreduce.job.reduces参数,提高排序任务的执行效率。

5. 索引使用【高版本hive】

  • 创建索引:对排序依据的列创建索引,能加快排序速度。例如,在student_scores表中,对score列创建索引:
CREATE INDEX score_index ON TABLE student_scores(score);
  • 索引维护:定期维护索引,确保其有效性。当数据发生大量插入、更新或删除操作后,重建或优化索引,以保证排序性能。

总结

Apache Hive的排序函数在多种场景下都有广泛应用。在数据分析中,当我们需要明确数据的先后顺序,如找出成绩排名前几的学生、销售额排名靠前的产品等,ROW_NUMBER函数可提供精确且唯一的排名,适用于严格区分先后顺序的场景。而在一些竞赛排名、成绩评级等场景中,如果允许并列排名且需要体现排名的间断性,RANK函数更为合适。对于希望在并列排名时保持排名连续性的场景,比如分析员工绩效等级,DENSE_RANK函数则能满足需求。这些排序函数为数据处理和分析提供了灵活多样的方式,帮助数据分析师和工程师更高效地从海量数据中提取有价值的信息。

相关文章:

Apache Hive--排序函数解析

在大数据处理与分析中,Apache Hive是一个至关重要的数据仓库工具。其丰富的函数库为数据处理提供了诸多便利,排序函数便是其中一类非常实用的工具。通过排序函数,我们能够在查询结果集中为每一行数据分配一个排名值,这对于数据分析…...

Java 接口安全指南

Java 接口安全指南 概述 在现代 Web 应用中,接口(API)是前后端交互的核心。然而,接口的安全性常常被忽视,导致数据泄露、未授权访问等安全问题。本文将详细介绍 Java 中如何保障接口安全,涵盖以下内容&am…...

合合信息名片全能王上架原生鸿蒙应用市场,成为首批数字名片类应用

长期以来,名片都是企业商务沟通的重要工具。随着企业数字化转型,相较于传统的纸质名片,数字名片对于企业成员拓展业务、获取商机、提升企业形象等方面发挥着重要作用。近期,合合信息旗下名片全能王正式上线原生鸿蒙应用市场&#…...

38.【3】CTFHUB web sql 报错注入

进入靶场 按照提示输入1 显示查询正确 既然是报错注入,先判断整形还是字符型注入 先输入1 and 11 再输入1 and 12 都显示查询正确,可知此为字符串型注入,不是数字型注入 然后就不会了 求助AI和其他wp 由以上2张搜索结果知updatexml是适用…...

RC2在线加密工具

RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。RC2是一种分组加密算法,RC2的密钥长度可变,可以从8字节到128字节,安全性选择更加灵活。 开发调试上,有时候需要进行对…...

NVIDIA 下 基于Ubuntun20.04下 使用脚本安装 ros2-foxy 和 使用docker安装 ros2-foxy

一、前提介绍: 本文主要采用两种方式在NVIDIA 下基于 Ubuntun20.04安装 ros2-foxy。 使用环境: NVIDIA 为 Jetson 系列下 Jetson Xavier NX; Ubuntun版本:20.04 二、安装方法: 1、使用脚本编译方式: 使…...

STL容器-- list的模拟实现(附源码)

STL容器-- list的模拟实现(附源码) List的实现主要考察我们对list这一容器的理解,和代码的编写能力,通过上节对list容器的使用,我们对list容器已经有了一些基本的了解,接下来就让我们来实现一些list容器常见…...

python——句柄

一、概念 句柄指的是操作系统为了标识和访问对象而提供的一个标识符,在操作系统中,每个对象都有一个唯一的句柄,通过句柄可以访问对象的属性和方法。例如文件、进程、窗口等都有句柄。在编程中,可以通过句柄来操作这些对象&#x…...

KubeSphere 与 Pig 微服务平台的整合与优化:全流程容器化部署实践

一、前言 近年来,为了满足越来越复杂的业务需求,我们从传统单体架构系统升级为微服务架构,就是把一个大型应用程序分割成可以独立部署的小型服务,每个服务之间都是松耦合的,通过 RPC 或者是 Rest 协议来进行通信,可以按照业务领域来划分成独立的单元。但是微服务系统相对…...

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块,主要模式如下图: 上节说到,我们需要用到AT固件进行局域网应用(ESP8266连接的STM32和手机进行连接)。 ESP8266为一个WiFi透传模块,和…...

Web开发 -前端部分-CSS-2

一 长度单位 代码实现&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…...

【QT用户登录与界面跳转】

【QT用户登录与界面跳转】 1.前言2. 项目设置3.设计登录界面3.1 login.pro参数3.2 界面设置3.2.1 登录界面3.2.2 串口主界面 4. 实现登录逻辑5.串口界面6.测试功能7.总结 1.前言 在Qt应用程序开发中&#xff0c;实现用户登录及界面跳转功能是构建交互式应用的重要步骤之一。下…...

记录一次关于spring映射postgresql的jsonb类型的转化器事故,并使用hutool的JSONArray完成映射

事件的起因是这样的&#xff0c;那次事故发生的起因是因为WebFlux和postgreSQL去重新做鱼皮的鱼图图项目&#xff08;鱼图图作业&#xff09;。 在做到picture表的时候&#xff0c;发现postgreSQL中有个jsonb的类型可以更好的支持json数组。 出于锻炼新技术的目的&#xff0c;…...

基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day2

为了使 2048 游戏的设计更加美观和用户友好&#xff0c;我们可以进行以下几项优化&#xff1a; 改善颜色方案&#xff1a;使用更温馨的颜色组合。添加动画效果&#xff1a;为方块的移动和合并添加渐变效果。优化分数显示&#xff1a;在分数增加时使用动画效果。 以下是改进后…...

Django框架:python web开发

1.环境搭建&#xff1a; &#xff08;a&#xff09;开发环境&#xff1a;pycharm &#xff08;b&#xff09;虚拟环境&#xff08;可有可无&#xff0c;优点&#xff1a;使用虚拟环境可以把使用的包自动生成一个文件&#xff0c;其他人需要使用时可以直接选择导入包&#xff…...

MySQL、HBase、ES的特点和区别

MySQL&#xff1a;关系型数据库&#xff0c;主要面向OLTP&#xff0c;支持事务&#xff0c;支持二级索引&#xff0c;支持sql&#xff0c;支持主从、Group Replication架构模型&#xff08;本文全部以Innodb为例&#xff0c;不涉及别的存储引擎&#xff09;。 HBase&#xff1…...

联发科MTK6762/MT6762安卓核心板_4G智能模块应用

MT6762安卓核心板是一款工业级高性能、可运行 android9.0 操作系统的 4G智能模块。MT6762平台打造具备 AI 体验、先进双摄像头拍摄效果且具备丰富连接功能的智能手机主板。 MT6762安卓核心板 是一款髙性能低功耗的 4G 全网通安卓智能模块。此模块支持 2G/3G/4G 移动&#xff0c…...

Windows7系统下载安装Source Code Pro字库

Source Code Pro字库介绍 Source Code Pro是由Adobe推出的一款专为代码展示和编写设计的开源等宽字体‌。它不仅在编程社区中广受好评&#xff0c;还被广泛应用于各种编辑器环境中&#xff0c;以提升代码的可读性和编程体验‌。 Source Code Pro的设计充分考虑了编程符号的呈…...

Navicat 17 功能简介 | 商业智能 BI

Navicat 17 功能简介 | 商业智能BI 随着 17 版本的发布&#xff0c;Navicat 也带来了众多的新特性&#xff0c;包括兼容更多数据库、全新的模型设计、可视化智能 BI、智能数据分析、可视化查询解释、高质量数据字典、增强用户体验、扩展 MongoDB 功能、轻松固定查询结果、便捷U…...

C# winodw TableLayoutPanel 料盒生产状态UI自动生成

料盒生产状态UI自动生成&#xff0c;效果如下 以前公司项目的这些都是手动拖控件做的。每个设备的料盒数量不一样&#xff0c;层数不一样时都要发好几个小时去改相关细节和代码。上次改了一次。这个又来了。上次就有想法做成根据参数自动生成。但项目时间有限有没有去深入思路和…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...