hive的分组和组内排序

2023-11-11

背景
hive的分组和组内排序—语法

语法:

row_number() over (partition by 字段a order by 计算项b desc ) rank

rank是排序的别名
partition by:用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。;
order by :排序,默认是升序,加desc降序;
这里按字段a分区,对计算项b进行降序排序

应用
测试数据

下面有一份测试数据id,dept,salary,然后我们就使用这份测试数据学习我们的窗口排序函数

1,销售,10000
2,销售,14000
3,销售,10000
4,后端,20000
5,后端,25000
6,后端,32000
7,AI,40000
8,AI,35000
9,AI,60000
10,数仓,20000
11,数仓,30000
12,数仓,32000
13,数仓,42000
create table ods_num_window(
    id string,
    dept string,
    salary int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
LOAD DATA LOCAL INPATH '/Users/liuwenqiang/workspace/hive/number.txt' 
OVERWRITE INTO TABLE ods_num_window;
每个部门的员工按照工资降序排序

每个部门都有自己的第一名,排序是发生在每个部门内部的

select
    *,row_number() over(partition by dept order by salary desc) as rank
from
    ods_num_window
;
全部的员工按照工资降序排序

当我们没有定义partition by 子句的时候,我们的所有数据都放在一个窗口里面,这个时候我们的排序就是全局排序,其实如果你仔细看过我们的Hive语法之窗口函数初识这一节的话,你就知道partition by 其实是定义了子窗口,如果没有子窗口的话,那就就是一个窗口,如果所有的数据都放在一个窗口的话那就是全局排序

select
    *,row_number() over(order by salary desc) as rank
from
    ods_num_window
;
取每个部门的工资前两名

这个是row_number() 函数非常常见的使用场景top-N,其实如果你仔细看过我们的Hive语法之窗口函数初识这一节的话,你就知道partition by 其实是定义了子窗口,那其实这里的top-N,本质上是子窗口的的top-N

select
    *
from(
   select
       *,row_number() over(partition by dept order by salary desc) as rank
   from
       ods_num_window
) tmp
where
    rank <=2
;

其实这个的实现方式就是我们对数据在子窗口内进行排序,然后选择出我们我们需要的数据,也就是这里的rn <=2

rank() over()

rank() over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)

select
    *,rank() over(partition by dept order by salary) as rn
from
    ods_num_window
;
dense_rank() over()是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .
select
    *,dense_rank() over(partition by dept order by salary) as rn
from
    ods_num_window
;
总结

rank() 排序相同时会重复,总数不会变(会有间隙跳跃,数据不连续)
dense_rank() 排序相同时会重复,总数会减少(不会有间隙,数据连续的)
row_number() 会根据顺序计算,不会重复不会减少
Row_number 函数常用的三种场景Top-N,计算连续,分组抽样

参考

1、Hive窗口函数row number的用法, 你肯定都会吧!
2、Hive row_number() 等用法
3、hive的分组和组内排序

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hive的分组和组内排序 的相关文章

随机推荐

  • RTTI

    自从1993年Bjarne Stroustrup 注1 提出有关C 的RTTI功能之建议 以及C 的 例外处理 exception handling 需要RTTI 最近新推出的C 或多或少已提供RTTI 然而 若不小心使用RTTI 可能会导
  • 【Https】keytool 导入证书到 本地 Exception: Input not an X.509 certificate

    文章目录 1 背景 本文为博主九师兄 QQ 541711153 欢迎来探讨技术 原创文章 未经允许博主不允许转载 1 背景 首先参考这篇文章 Spring Spring Boot 支持 Https 根据这篇文章生成了这个文件 然后根绝这个文
  • MFC中简单上位机框架搭建

    项目源码下载地址 http download csdn net download zhuzemin45 12005663 文章主要分三个部分 一 非模态 模态 对话框创建 二 标签页创建 三 Button调用多标签页的非模态对话框 1 非模
  • “百钱买百鸡”编程详解。

    1 题目描述 百钱买百鸡 是我国古代的著名数学题 3 文钱可以买 1 只公鸡 2 文钱可以买一只母鸡 1 文钱可以买 3 只小鸡 用 100 文钱买100 只鸡 那么各有公鸡 母鸡 小鸡多少只 2 分析 计算机无法通过直接的计算得出具体的数
  • QTimer与事件循环和多线程

    定时器的源码分析 startTimer返回定时器的ID 在定时时间到了后 收到一个QTimerEvent 并覆盖虚函数timerEvent进行处理 该QTimerEvent包括了定时器ID 看QTimer的源码就明白了 QObject st
  • java创建自定义类的数组

    java创建自定义类的数组 错题笔记 学习动态规划做例题hdu 2602遇到的问题 创建自定义类后 新建一个自定义类的数组 向数组赋值时报如下错误 java lang NullPointerException Cannot assign f
  • 【Qt】一篇全面的信号和槽函数机制总结

    信号和槽函数机制 文章目录 信号和槽函数机制 一 信号和槽机制简介 二 信号 2 1 信号的发出 2 2 信号的处理 三 槽函数 3 1 带有默认参数的信号和槽函数 3 2 使用 QObject connect 将信号连接到槽函数的三种方法
  • integer operation result is out of range

    程序中 有如下定义 define UART1 EN 1 lt lt 31 编译后编译器报错 integer operation result is out of range 经查资料是由于溢出所致 宏定义默认常量是有符号型 当左移31位时
  • kerberos认证过程

    KDC Key Distribution Center 密钥分发中心 里面包含两个服务 AS和TGS AS Authentication Server 身份认证服务 TGS Ticket Granting Server 票据授予服务 TGT
  • [python] 使用scikit-learn工具计算文本TF-IDF值

    在文本聚类 文本分类或者比较两个文档相似程度过程中 可能会涉及到TF IDF值的计算 这里主要讲述基于Python的机器学习模块和开源工具 scikit learn 希望文章对你有所帮助 相关文章如下 python爬虫 Selenium获取
  • 铨顺宏RFID:试卷管理中RFID技术智能系统发挥着什么样的作用

    1 项目背景 在我国的教育招生考试中 试卷的管理一直是比较棘手的问题 它涉及试卷的组卷 印刷 封包 运输 发放 回收 入库 阅卷以及历史保存等一系列复杂的流程 且数量巨大 到目前为止 我国的试卷管理主要还是采取的人工管理方式 势必存在安全形
  • 随机抽奖小程序

    本实例使用随机数字生成5位抽奖号码 并显示在窗体的5个文本框中 当用户单击 开始 按钮时 将启动一个线程对象为5个文本框生成随机数字 单击 抽奖 按钮时 线程对象停止运行 并且将准确的中奖号码显示在信息文本框中 开发一个抽奖小工具的实例 1
  • 基于PaddleClas的PP-LCNet实现车辆颜色及车型属性识别

    目录 源码 yolov5源码 1 环境准备 2 数据准备 3 车辆检测
  • 目标检测评价指标合集

    目标检测评价指标 混淆矩阵 confusion matrix 可谓是贯穿了整个目标检测评价体系 衍生了一系列的目标检测评价指标 如精确率 precision 准确率 accuracy 召回率 recall F1 score ROC AUC指
  • ag-grid 学习笔记四:ag-grid方法(重设行数据、增删改、反选、新增列、插入新行、合计行接口、遍历行对象、获取置顶行数量、获取底部合计行对象、获取行对象、刷新、单元格焦点)

    一 setRowData重新设置表格行数据 重新设置表格数据很简单 只需要调用 gridOptions api setRowData 数据集 接口传入数据即可 以下函数为调用方式 function resetGrid 新的数据项 var N
  • Hackinglab(鹰眼)——基础关

    目录 1 key在哪里 2 再加密一次你就得到key啦 3 猜猜这是经过了多少次加密 4 据说MD5加密很安全 真的是么 5 种族歧视 6 HAHA浏览器 7 key究竟在哪里呢 8 key又找不到了 9 冒充登陆用户 10 比较数字大小
  • Lucene使用IK中文分词

    Lucene使用IK中文分词 环境 Lucene 6 x IKAnalyzer2012 u6 也可以通过Maven或Gradle构建工程测试和验证 对于Lucene的最新版本 需要找到IK Analyzer对应的兼容版 传送门 Lucene
  • 最新gcc下载和linux环境变量设置

    最新gcc下载和linux环境变量设置 一 gcc下载 提供最新gcc下载路径 点这里跳转 http ftp gnu org gnu gcc 安装 gcc package configure prefix usr local gcc nam
  • 前端使用代理跨域后后端无法接收Session

    将一个 MVC 项目重构为一个前后端分离项目 前端使用了 react axios vite 在前后端分离项目中 通常都会使用代理来解决跨域问题 vite 需要在 vite config js 文件中配置代理 export default d
  • hive的分组和组内排序

    背景 hive的分组和组内排序 语法 语法 row number over partition by 字段a order by 计算项b desc rank rank是排序的别名 partition by 用于给结果集分组 如果没有指定那么