over() :窗口函数,在括号中指定开窗条件,通常和聚合函数、排名函数一起使用。如果开窗条件为空,那么聚合的是过滤后的整张表。
一个窗口函数就会启动一个MR程序

开窗条件

PARTITION BY:指定分组条件。
ORDER BY:指定组内排序条件。
CURRENT ROW:当前行。
n PRECEDING:前n行。
n FOLLOWING:后n行。
UNBOUNDED:无限的。UNBOUNDED PRECEDING 第一行,UNBOUNDED FOLLOWING最后一行。
LAG(字段名,n):某一列当前行的前n行。
LEAD(字段名,n):某一列当前行的后n行。
NTILE(n):将数据分组并发送到不同窗口,返回组号。

排名函数

RANK():排名有重复,总数不会变。
DENSE_RANK():排名有重复,总数会减少。
ROW_NUMBER():按顺序排名,无重复。

练习1

create table business(
name string,
orderdate string,
cost int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';-- 数据如下
jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94
  • 查询在2017年4月份购买过的顾客及总人数
-- over()不写开窗条件,聚合的是过滤后的整张表
SELECT name,count(*) over() cnt
FROM business WHERE substring(orderdate,1,7)='2017-04'
GROUP BY name;
  • 查询顾客的购买明细及月销售总额
-- 按照月份分组,组内相加
SELECT name,orderdate,cost,
SUM(cost) OVER(PARTITION BY substring(orderdate,1,7)) mtotal
FROM business;
  • 总销售额
-- over()中不写开窗条件就是统计整张表
SELECT name,orderdate,cost,
SUM(cost) OVER() total
FROM business;
  • 每个人的消费总额
-- 根据姓名分区,组内相加
SELECT name,orderdate,cost,
SUM(cost) OVER(PARTITION BY name) ev_cost
FROM business;
  • 每个人截至到当前行的消费额累加
-- 按照姓名分组,从第一行到当前行累加
SELECT name,orderdate,cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate) ev_cur_cost
FROM business;SELECT name,orderdate,cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) ev_cur_cost2
FROM business;
  • 每个人上一次购物与此次购物的总额
-- 按姓名分组,组内前一行和当前行相加
SELECT name,orderdate,cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) ev_pre_cost
FROM business;
  • 每个人连续三次购物的总额
-- 按姓名分组,组内连续三次相加
SELECT name,orderdate,cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) ev_con_cost
FROM business;
  • 每个人当前行与后面所有行的累计额
-- 按照姓名分组,当前行与后面所有行的累加
SELECT name,orderdate,cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) ev_foll_cost
FROM business;
  • 查看顾客上次的购买时间
-- 购买日期列当前行的前1行,只查看上次购买时间,不用分组
SELECT name,orderdate,cost,
LAG(orderdate,1) OVER(ORDER BY orderdate) lag_cost_time
FROM business;
  • 查询前20%时间的订单信息
-- 数据按照时间分为5组,取第一组的数据
SELECT *
FROM(SELECT name,orderdate,cost,
NTILE(5) OVER(ORDER BY orderdate) n
FROM business) tbl
WHERE n=1;

有哪些顾客连续两(或n)天来过我的店

-- 1.先给数据按姓名分组,按日期排序并加行号
SELECT name,orderdate,
ROW_NUMBER() OVER(PARTITION BY name ORDER BY orderdate) n
FROM business;
-- 2.日期与行号相减,如果连续两(或n)行结果一致,那么就是连续两(或n)天都来过
SELECT *,DATE_SUB(orderdate,n) ds
FROM (SELECT name,orderdate,
ROW_NUMBER() OVER(PARTITION BY name ORDER BY orderdate) n
FROM business) t1;
-- 3.count聚合,大于等于2(或n)就是连续两(或n)天都来过
SELECT name,count(*) c
FROM (SELECT *,DATE_SUB(orderdate,n) dsFROM (SELECT name,orderdate,ROW_NUMBER() OVER(PARTITION BY name ORDER BY orderdate) nFROM business) t1)t2
GROUP BY name,ds HAVING c>=2;

练习2

有如下数据:

name subject score
孙悟空  语文    87
孙悟空  数学    95
孙悟空  英语    68
大海    语文    94
大海    数学    56
大海    英语    84
宋宋    语文    64
宋宋    数学    86
宋宋    英语    84
婷婷    语文    65
婷婷    数学    85
婷婷    英语    78
  • 计算每门学科成绩排名
SELECT subject,name,score,
RANK() OVER(PARTITION BY subject ORDER BY score DESC) rk,
DENSE_RANK() OVER(PARTITION BY subject ORDER BY score DESC) drk,
ROW_NUMBER() OVER(PARTITION BY subject ORDER BY score DESC) rnm
FROM score;

Hive 窗口函数的使用相关推荐

  1. 大数据技术-hive窗口函数详解

    有不少同学一听这个标题,hive窗口函数是什么鬼?没听说过还有窗口函数这个东西啊,其实它的用处可大了,下面听小千慢慢道来. hive窗口函数 窗口函数指定了函数工作的数据窗口大小(当前行的上下多少行) ...

  2. HiveQL学习笔记(四):Hive窗口函数

    本系列是本人对Hive的学习进行一个整理,主要包括以下内容: 1.HiveQL学习笔记(一):Hive安装及Hadoop,Hive原理简介 2.HiveQL学习笔记(二):Hive基础语法与常用函数 ...

  3. hive窗口函数使用

    hive窗口函数的使用 前言 一.hive窗口函数语法 1.over()窗口函数的语法结构 1.1.over()函数中的三个函数讲解 2.常与over()一起使用的分析函数 2.1.聚合类 2.2.排 ...

  4. Hive 窗口函数 实现原理

    Hive 窗口函数 实现原理 hive中窗口函数的实现,主要是借助于一个叫做 Windowing Table Function 的Partitioned Table Function Partitio ...

  5. hive 窗口函数(持续更新)

    hive窗口函数语法 avg().sum().max().min()等是分析函数,而over()才是窗口函数,下面我们来看看over()窗口函数的语法结构.及常与over()一起使用的分析函数: 1. ...

  6. HIVE 窗口函数和分析函数

    **HIVE 窗口函数和分析函数** 第一篇,试试水: 一.介绍 分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行. 开窗函数指定了分析 ...

  7. Hive窗口函数之累积值、平均值、首尾值的计算学习

    Hive窗口函数可以计算一定范围内.一定值域内.或者一段时间内的累积和以及移动平均值等:可以结合聚集函数SUM() .AVG()等使用:可以结合FIRST_VALUE() 和LAST_VALUE(), ...

  8. hive 窗口函数_Datatist科技专栏 | Hive排序窗口函数速学教程!

    作者:原上野 设计:Cindy 编辑:AI君 在开发过程中经常会遇见排序的场景,比如取top N的问题,这时候row_number(),rank,dense_ran()这三个函数就派上用场了,其中,r ...

  9. hive窗口函数_Hive sql窗口函数源码分析

    在了解了窗口函数实现原理 spark.hive中窗口函数实现原理复盘 和 sparksql比hivesql优化的点(窗口函数)之后,今天又撸了一遍hive sql 中窗口函数的源码实现,写个笔记记录一 ...

  10. Hive窗口函数(over/partition by/order by/window/序列函数)总结与实践

    一.简介 本文主要介绍Hive中的窗口函数,Hive中的窗口函数和SQL中的窗口函数相类似,都是用来做一些数据分析类的工作,一般用于olap分析(在线分析处理). 二.概念 我们都知道在sql中有一类 ...

最新文章

  1. MaxCompute大数据实践,电商数据仓库选择雪花还是星型模型?
  2. redis的五种存储类型的具体用法
  3. flex4.6 保留自动产生的actionscript代码的编译选项
  4. 电商库存详解:三层(销售层、调度层、仓库层)来看库存设计
  5. c语言中 快速输出字符数组后几位方法
  6. 4章 关键的“构建”决策
  7. 《南溪的python灵隐笔记》——有趣的Munch字典库
  8. linux 环境安装及学习
  9. 解秘java中native方法如何实现:手把手带你实现java native方法
  10. 解决APKIDE(APK改之理)运行出现ApkIDE Exception:…报错的问题
  11. 微信小程序展示弹窗的方式
  12. dev、test和staging、prod是什么意思?
  13. Cookie测试之详解
  14. 用友NC V6.5 6.33 6.31 6.3 6.1 2019新个人所得税增强包税改升级补丁包
  15. Linux的PCI驱动介绍(入门)
  16. html5中播放本地音乐播放器,首款HTML5播放器 支持浏览器内播放本地音乐
  17. java整合kafka做消息消费
  18. SQLException: The server time zone value ‘EDT‘ is unrecognized or represents more than one time zone
  19. Java如何抛出异常
  20. 微星GS66安装ubuntu18.04(网卡和NVIDIA显卡驱动可以同时用)

热门文章

  1. java中级考试_Java中级开发工程师笔试题及答案2016
  2. Vue全家桶 之 KTV前台收银管理系统 (不想努力啦,回家收钱去)
  3. ktv收银管理系统服务器,KTV包厢收银管理系统增强版
  4. php7 libiconv,CentOS 7下编译libiconv
  5. JavaScript快速入门
  6. AD学习笔记(三)PCB封装库绘制
  7. Linux下修复U盘坏块,快速修复U盘坏块的方法
  8. 如何固定电脑桌面便签 win7便签怎么设置?
  9. vue从s3(AWS)中获取图片并展示
  10. 李宏毅深度学习HW2 收入预测 (logistic regression)