关于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) s where s.rank <= 1


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

这里有写关于这个函数的博客,大家可以看看。

http://blog.sina.com.cn/s/blog_6676d74d0102vm2c.html

https://blog.csdn.net/u010670689/article/details/49337137

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页