欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

关于hive的运行流程记录

程序员文章站 2024-01-26 11:04:16
1、collect_set函数 需求:求用户消费的 TOP 100,需要的数据格式是:ID 消费金额 nickname 分析:消费 TOP 比较简单 group by uuid order...

1、collect_set函数

需求:求用户消费的 TOP 100,需要的数据格式是:ID 消费金额 nickname

分析:消费 TOP 比较简单 group by uuid order by allCnt 可以解决,但是用户的nickname(昵称)是有多个的,随机取一个就行,但是 hive 取的数据字段中必须在 group by 中出现,取nickname就有点麻烦了,这时候collect_set() 函数就派上用场了。

解决方案:

table:bank_core

uuid payMem nickname dt

10001 12.5 jack 2018-04-16 00:15:00

10001 15.5 jack_2 2018-04-16 15:00:00

10002 10.2 tom 2018-04-16 17:00:00

.....................................

sql:select uuid, sum(payMem) allCnt, collect_set(nickname)[0] from bank_core group by uuid order by allCnt desc limit 100;

2、row_number() over ( partition by 字段a order by 字段b [desc])函数

row_number() over ( partition by 字段a order by 字段b ) 这个函数用于对 group by 分组里面的数据进行排序的。

需求:求用户消费的 TOP 100,需要的数据格式是:ID 消费金额 nickname, 此处的nickname 需要是用户最新的昵称。

分析:上面用到的collect_set() 函数是随机取一个 nickname,此处就不太吻合需求了,row_number() over ... 就可以解决这个问题了,row_number() over (partition by uuid order by dt desc),指在分组中按照 uuid 分组,按照 dt 排序, 这里得到的是 num

解决方案:

数据如上。

sql:select s.uuid, s.allCnt, s.nickname from

( select uuid, sum(payMem) allCnt, nickname,

row_number() over (partition by uuid order by dt desc)rank from bank_core group by uuid,nickname, dt) swhere s.rank <= 1

 

关于 row_number() over (partition by 字段a order by 字段b ) 这个函数解释得可能很不清楚。。。