作者:原上野

设计:Cindy

编辑:AI君

在开发过程中经常会遇见排序的场景,比如取top N的问题,这时候row_number(),rank,dense_ran()这三个函数就派上用场了,其中,row_number()最为常用。

虽然都可以排序,但是他们之间还有点细微的区别,具体的差异请参阅下面的实例;本文除了这三个函数外,还简单介绍了下NTILE() over()这个函数。

开始之前先在hive准备一张表dw_table_test,数据如下:

1

row_number() over()

(a) row_number() over()分组排序功能

注意:在使用 row_number() over()函数时候,over()里的分组以及排序的执行晚于 where group by order by 的执行。

partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。

如下例子,根据每url进行分组,按照pv从高到低排序

Sql:select url, pv,row_number() over(partition by url order by pv desc) as rn from dw_table_test;

结果:

(b)row_number() over()无分组排序

如下例子,按照pv从高到低排序

Sql:select url, pv,row_number() over(order by pv desc) as rn from dw_table_test;

结果:

2

rank() over()

rank() over()是跳跃排序,有两个第二名时接下来就是第四名。

(a)rank() over()分组排序功能

如下例子,根据每url进行分组,按照pv从高到低排序

Sql:select url,pv,rank() over(partition by url order by pv desc) as rn From dw_table_test;

结果:

(b) rank() over()无分组排序

如下例子,按照pv从高到低排序

Sql:select url,pv,rank() over(order by pv desc) as rn From dw_table_test;

结果:

3

dense_rank() over()

dense_rank() over()是连续排序,有两个第二名时仍然跟着第三名,而row_number是没有重复值的。

(a)dense_rank () over()分组排序功能

如下例子,根据每url进行分组,按照pv从高到低排序

Sql:select url,pv, dense_rank() over(partition by url order by pv desc) as rn from dw_table_test;

结果:

(b)dense_rank () over()无分组排序

如下例子,按照pv从高到低排序

Sql:select url,pv, dense_rank() over(order by pv desc) as rn from dw_table_test;

结果:

4

NTILE() over()

NTILE(n),属于分析函数,用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布。

(a)NTILE() over()有分组

如下例子,根据url进行分组,按照pv从高到低排序将数据拆成两份

Sql:select url,pv,NTILE(2) over(partition by url order by pv desc ) as rn from dw_table_test;

结果:

(b)NTILE() over()无分组

如下例子,按照pv从高到低排序将数据拆成两份

Sql:select url,pv,NTILE(2) over(order by pv desc ) rn from dw_table_test;

结果:

5

总结

通过上面的事例可以很轻易区分它们,以便应用于不同的场景;还有一点需要注意就是:在以上提到的四个窗口函数中,都不支持ROWS BETWEEN/ RANGE BETWEEN, ROWS BETWEEN表示在当前行之间,RANGE BETWEEN表示在当前值范围内;而类似于sum,count这样的聚合函数是可以这样使用,比如下面的实例。

原始数据

Sql:

Select * from dw_table_test order by date_time desc;

处理后

rows between 1 preceding and 1 following表示在当前行上下一行之间的范围内

sql:select url,date_time,sum(pv) over(order by date_time desc rows between 1 preceding and 1 following) as rn from dw_table_test;

结果:

hive 窗口函数_Datatist科技专栏 | Hive排序窗口函数速学教程!相关推荐

  1. Hive、Hadoop完全分布式安装,基本SQL,基本SQL,基本表结构,数据类型,函数,窗口函数,jion,查询和排序,beeline,文件格式及基本架构汇总

    目录 Hive简介 一.概述 二.Hive和数据库的比较 三.特点 Hadoop完全分布式安装 一.配置 二.安装步骤 Hive安装 一.概述 二.安装步骤 其他 一.Hive运行日志 二.Hive的 ...

  2. Hive(20):Hive的函数之窗口函数

    目录 0. 相关文章链接 1. 窗口函数概述 1.1. 什么是窗口函数 1.2. 窗口函数的功能 1.3. 窗口函数的种类和位置 1.4. 窗口函数说明 2. 聚合窗口函数 3. 排序窗口函数 3.1 ...

  3. hive mysql 实战_【Hive】HiveQL实战之分析函数窗口函数

    本篇主要介绍将存储到Mysql的示例数据库Sakila以Sqoop的方式导入到Hive,然后详细讲解Hive的分析函数和窗口函数. 一 实战环境 1 Hive版本 hive> select ve ...

  4. Hive 按某列的部分排序 以及 删列操作

    Hive 按某列的部分排序 以及 删列操作 脑袋果然还是智商不足. 涉及到的小需求: 某个表test 有一列 tc: a字符串+b字符串+c字符串 拼接组成 把test表,按b字符串排序 输出 遇到的 ...

  5. RDBMS之SQL:SQL语言的各种方言的简介(MySQL/Hive SQL/PQL/OracleSQL/SQLite影响力排序)、主流语言的对比之详细攻略

    RDBMS之SQL:SQL语言的各种方言的简介(MySQL/Hive SQL/PQL/OracleSQL/SQLite影响力排序).主流语言的对比之详细攻略 目录 SQL语言的各种方言的简介 1.My ...

  6. 2021年大数据Hive(七):Hive的开窗函数

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的开窗函数 一.窗口函数 ROW_NUMBER,RANK ...

  7. 打怪升级之小白的大数据之旅(六十七)<Hive旅程第八站:Hive的函数>

    打怪升级之小白的大数据之旅(六十七) Hive旅程第八站:Hive的函数 上次回顾 上一章,我们学习了如何对数据进行拆分–分区表与分桶表,使用分区表与分桶表,可以加快我们的查询效率..本章节是Hive ...

  8. Hive 中的wordCount、Hive 开窗函数

    Hive 中的wordCount.Hive 开窗函数 目录 Hive 中的wordCount.Hive 开窗函数 Hive 中的wordCount Hive 开窗函数 测试数据 建表语句 1.row_ ...

  9. 2021年大数据Hive(十一):Hive调优

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive调优 一.本地模式 1.空key处理 二.SQL ...

最新文章

  1. 计算机专业it职业英语作文,英文简历范文:计算机专业
  2. 【转】“根级别上的数据无效”问题的解决
  3. 走进腾讯 |《产品经理第一课》宜信、零度无人机、悦跑圈核心团队独家分享爆款产品的打造秘籍...
  4. nyoj-716 River Crossing(动态规划)
  5. c语言搜索多层文件夹,c语言 遍历搜索文件夹(获取文件夹中所有内容)
  6. oracle必须声明标识符函数,引用变量时需要必须声明标识符
  7. java实现磁盘分配显示_Java实现窗体动态加载磁盘文件
  8. 年轻人原地过年,也不忘搞钱
  9. python常用单词有多少_Python常用单词
  10. Python import容易犯的一个错误
  11. (转载) AT指令详解
  12. appserv+win8
  13. PyQt+PyQtWebEngine+Spyder问题小结
  14. ARM PWN基础教程
  15. 让更多的开发者听到您的声音,移动开发征文活动现已开始 | 开发者说·DTalk
  16. ORA-20011, KUP-11024 外部表引发报错
  17. Facebook_scraper:Python获取FB用户的公开发帖【FaceBook系列 一】
  18. Instant类使用
  19. 数据库分类及常用数据库
  20. SIMPLE算法求解多孔介质的一维流动控制方程

热门文章

  1. java前言_Java Web前言
  2. MapReduce计数器
  3. Golang tcp转发 remoteAddr错误
  4. CentOs7.2编译安装Nginx服务器
  5. Java学习笔记三——数据类型
  6. 【poj3070】Fibonacci
  7. 本来中午打算应付下随便吃点,可是连盐都没有放的辣椒炒蛋实在是令人不快...
  8. ASP.NET MVC中的模型装配 封装方法 非常好用
  9. 【转】android程序连接网络出现android.os.NetworkOnMainThreadExceptionat
  10. java指令和javac指令总结