阿里云大数据利器Maxcompute学习之--窗口函数实现分组TopN

看到很多用户经常会问如何对分组内进行排序。
官方文档:https://help.aliyun.com/document_detail/34994.html?spm=5176.doc27891.6.611.Q1bk3j
例如需求:
1. odps 里面能否做排名操作,比如一个表里面有 用户ID 和 金额 两个字段,用金额大小排序的话,我如何计算用户的排名(金额最大的是 第一名 ,以此类推)
2. 计算每个金融产品的最大投资者,或者前几名

类似这一类的需求,我们总结为实现分组内的排序,取TopN,那么在hive中有两个个函数可以分开实现
first_value: 取分组内排序后,截止到当前行,第一个值,
row_number():实现组内排序,并对组内行进行标记行号。
那在odps中没有first_value这个函数,但是同样可以实现top1的需求。下面用一个大家最爱的公司员工表来举例实现

员工表:

empno ename job mgr hiredate sal comm deptno
7839 KING PRESIDENT NULL 1981-11-17 00:00:00 5000.0 NULL 10
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975.0 NULL 20
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850.0 NULL 30
7788 SCOTT ANALYST 7566 1987-07-13 01:00:00 3000.0 NULL 20
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450.0 NULL 10
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800.0 NULL 20
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000.0 NULL 20
7876 ADAMS CLERK 7788 1987-07-13 01:00:00 1100.0 NULL 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950.0 NULL 30
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300.0 NULL 10
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600.0 300.0 30
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250.0 1400.0 30
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500.0 0.0 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250.0 500.0 30

使用row_number()对相同 job 的薪水sal 进行

排序,取组内最大,等不及了,直接上sql

```select * from (
select job,sal,
row_number() over(partition by job order by sal desc) as rn from emp
) a where rn=1;
//partition by 跟分组字段
//order by 跟排序字段+升降关键字 默认升序排列。



结果:

job | sal  | rn    |
-----|----------|------------
 ANALYST | 3000.0     | 1
CLERK | 1300.0     | 1
 MANAGER | 2975.0     | 1
 PRESIDENT | 5000.0     | 1
 SALESMAN | 1600.0     | 1          

同理如果想实现topN,那把rn=1改成rn<N,例如我想看每个岗位job前两个工资最多的人,sql如下

select * from (
    select job,ename,sal,
     row_number() over(partition by job order by sal desc) as rn  from emp
 ) a where rn<3;

结果:

job | ename | sal     | rn         |
----|-------|----------|------------
ANALYST | SCOTT | 3000.0     | 1          |
ANALYST | FORD  | 3000.0     | 2          |
 CLERK | MILLER | 1300.0     | 1          |
CLERK | ADAMS | 1100.0     | 2          |
 MANAGER | JONES | 2975.0     | 1          |
 MANAGER | BLAKE | 2850.0     | 2          |
PRESIDENT | KING  | 5000.0     | 1          |
 SALESMAN | ALLEN | 1600.0     | 1          |
SALESMAN | TURNER | 1500.0     | 2          |
+-----+-------+------------+------------+
那这是一个简单的例子。
对于类似需求可以用这个方法来实现TopN的计算。
注意:这种方法对于数量级不是很大的或者分组比较均匀的大数据量实用,
如果分组键值不均匀,导致单个或者几个键值比较大,那会有数据倾斜的问题。此时我们可以从sql上优化写法,例如可以排查哪几个键值比较大单独拉出来一个任务执行。

时间: 2024-10-09 02:05:18

阿里云大数据利器Maxcompute学习之--窗口函数实现分组TopN的相关文章

阿里云大数据利器Maxcompute学习之-假如你使用过hive

如果您是一个大数据开发工程师并且使用过hadoop的hive框架,那么恭喜您,阿里云的大数据计算服务-Maxcompute,您已经会了90%.这篇文章就来简单对比下Maxcompute和hive的异同,来方便刚开始使用Maxcompute的用户,从hive秒速迁移到Maxcompute的使用上. 首先,回顾下hive的概念. 1.hive是基于hadoop的,以表的形式来存储数据,实际上数据是存储在hdfs上,数据库和表其实是hdfs上的两层目录,数据是放在表名称目录下的,计算还是转换成mapr

阿里云大数据利器Maxcompute学习之--数据同步任务常见日志报错总结

在使用大数据开发套件时最常用的就是数据同步模块,工单里最常见的问题就是其中数据同步的问题,这里总结一些常见一些从Maxcompute到其他数据源的同步任务报错案例,主要是日志中出现数据回滚写入的问题.   那首先看下日志中数据回滚的原因,当数据写入rds或者hybridDB等一些支持事务的数据库中,数据批量写入,一旦由于各种原因没有写入成功,这个批次的数据会回滚重新写入,如果再次写入失败,就会报脏数据的错误导致任务失败.数据写入失败可能是以下原因导致回滚.1,脏数据(数据值超过数据类型最大范围,

阿里云大数据利器Maxcompute学习之--分区表的使用

初学大数据Maxcompute时部分用户不是很熟悉Maxcompute分区表的概念和使用,那这篇文章来简单介绍下分区表的概念及使用场景.  实际上,分区在很多框架中都有这个概念,比如开源框架中的hive等.打个比喻,某城市粮仓里存放麦子,粮仓里按照县城分为很多区域,每个县城都有自己的一块地方,每个县城的麦子放在自己对应的区域上.如果上级领导来检查,想看某县城的麦子情况,那直接可以根据区域来迅速找到该县城的麦子.对应到Maxcompute分区表,粮仓相当于其中一张表,每个区域相当于以这个县城命名的

深入阿里云大数据IDE–MaxCompute Studio

摘要:在主办的云栖计算之旅第5期–大数据与人工智能分享中,阿里云计算平台高级专家薛明为大家深入地介绍了阿里云大数据IDE–MaxCompute Studio,并对于其特性和背后的技术思想进行了讲解. 本文根据演讲视频整理而成. 本次将与大家深入地分享阿里云数加平台的大数据开发套件--MaxCompute Studio.其实对于开发者而言,在大数据开发.数据处理以及管理作业时经常会使用到IDE,而在阿里巴巴内部也有上万名大数据开发者,他们也会使用数加平台,也就是阿里巴巴统一的计算引擎--MaxCo

【阿里云大数据产品MaxCompute(原名ODPS)】DT时代企业数据资产的护卫舰

免费开通大数据服务:https://www.aliyun.com/product/odps 阿里云数加MaxCompute(原名ODPS)设计之初就是面向多租户,确保租户的数据安全是MaxCompute的必备功能之一.在MaxCompute系统的安全设计和实现上,MaxCompute的工程师们会遵循一些经过实践检验的安全设计原则(如Saltzer-Schroeder原则).在常用密码算法及安全协议的设计和实现上,也会遵循业界相关标准(如PKCS-及FIPS-系列标准),并坚持最佳安全实践. 这里

阿里云大数据利器之-使用flume+sql实现流计算做实时展现业务(归档Maxcompute)

实时业务处理的需求越来越多,也有各种处理方案,比如storm,spark等都可以.那以数据流的方向可以总结成数据源-数据搜集-缓存队列-实时处理计算-数据展现.本文就用阿里云产品简单实现了一个实时处理的方案. 一,总体架构 按照数据流向 数据采集:flume(配置故障转移) 缓存队列:datahubhttps://help.aliyun.com/product/53345.html?spm=5176.7618386.3.4.cigK2v 数据计算:阿里流计算(StreamCompute)http

阿里云大数据利器之-使用sql实现流计算做实时展现业务( flume故障转移版 )

实时业务处理的需求越来越多,也有各种处理方案,比如storm,spark等都可以.那以数据流的方向可以总结成数据源-数据搜集-缓存队列-实时处理计算-数据展现.本文就用阿里云产品简单实现了一个实时处理的方案. 一,总体架构 按照数据流向 数据采集:flume(配置故障转移) 缓存队列:datahubhttps://help.aliyun.com/product/53345.html?spm=5176.7618386.3.4.cigK2v 数据计算:阿里流计算(StreamCompute)http

阿里云大数据利器Maxcompute-使用mapjoin优化查询

大数据计算服务(MaxCompute,原名 ODPS)是一种快速.完全托管的 GB/TB/PB 级数据仓库解决方案.https://help.aliyun.com/document_detail/27800.html?spm=5176.7840267.6.539.po3IvS 主要有三种操作数据的方式SQL,UDF,MapReduce,了解hadoop的同学就比较熟悉这些东西了. 那么Maxcompute的SQL和标准SQL最大的区别就是在Maxcompute中SQL会被解析成MapReduce

阿里云大数据实验室:MaxCompute使用体验

阿里云大数据实验室时阿里云开发的一站式大数据教学实践和科研创新平台,提供创业创新大赛平台,为各行业用户提供简单易用的大数据真实环境,让数据价值触手可及.在阿里云大数据实验室中集成了MaxCompute.        作为一名初次使用MaxCompute的用户,我体会颇深.MaxCompute 开箱即用,拥有集成化的操作界面,你不必关心集群搭建.配置和运维工作.仅需简单的点击鼠标,几步操作,就可以在MaxCompute中上传数据,分析数据并得到分析结果. 作为一种快速.完全托管的 TB/PB 级