关于hive的运行流程记录
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 ) 这个函数解释得可能很不清楚。。。