阿里交叉面试问到了这个题,当时感觉没有答好,主要是对Hive这块还是不熟悉,其实可以采用row_number()函数。

1、ROW_NUMBER,RANK(),DENSE_RANK()

语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rank
partition by:类似hive的建表,分区的意思;
order by :排序,默认是升序,加desc降序;
rank:表示别名
表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

1.1 案例

1.1.1 样本数据

  1. 浙江,杭州,300
  2. 浙江,宁波,150
  3. 浙江,温州,200
  4. 浙江,嘉兴,100
  5. 江苏,南京,270
  6. 江苏,苏州,299
  7. 江苏,某市,200
  8. 江苏,某某市,100

1.1.2导入数据

  1. --执行下述语句
  2. hive (temp)> hive -f 'HQL/loaddata.hql'>out/tmp;
  3. -----------------------------------------------
  4. drop table datatable;
  5. CREATE table datatable (
  6. province string,
  7. city string,
  8. people int)
  9. ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
  10. STORED AS TEXTFILE;
  11.  
  12. load data local inpath 'home/loaddata'
  13. overwrite into table temp.datatable;
  14. ----------------------------------------------
  15. --查看结果
  16. hive (temp)> select * from datatable;
  17. OK
  18. province city people
  19. 浙江 杭州 300
  20. 浙江 宁波 150
  21. 浙江 温州 200
  22. 浙江 嘉兴 100
  23. 江苏 南京 270
  24. 江苏 苏州 299
  25. 江苏 某市 200
  26. 江苏 某某市 100

1.2 按照人口降序排列,生成衍生变量

  1. select province,city,
  2. rank() over (order by people desc) rank,
  3. dense_rank() over (order by people desc) dense_rank,
  4. row_number() over(order by people desc) row_number
  5. from datatable
  6. group by province,city,people;
  7.  
  8. --结果
  9. province city rank dense_rank row_number
  10. 浙江 杭州 1 1 1
  11. 江苏 苏州 2 2 2
  12. 江苏 南京 3 3 3
  13. 浙江 温州 4 4 4
  14. 江苏 某市 4 4 5
  15. 浙江 宁波 6 5 6
  16. 江苏 某某市 7 6 7
  17. 浙江 嘉兴 7 6 8

主要注意打圈的:
row_number:顺序下来
rank:在遇到数据相同项时,会留下空位5,(第一列4,4,6)
dense_rank:在遇到数据相同项时,不会留下空位,(红框内第一列,4,4,5)

1.3 分组按照省份分区,再按照人口降序排列,生成衍生变量

  1. select province,city,
  2. rank() over (partition by province order by people desc) rank,
  3. dense_rank() over (partition by province order by people desc) dense_rank,
  4. row_number() over(partition by province order by people desc) row_number
  5. from datatable
  6. group by province,city,people;
  7.  
  8. --结果
  9. province city rank dense_rank row_number
  10. 江苏 苏州 1 1 1
  11. 江苏 南京 2 2 2
  12. 江苏 某市 3 3 3
  13. 江苏 某某市 4 4 4
  14. 浙江 杭州 1 1 1
  15. 浙江 温州 2 2 2
  16. 浙江 宁波 3 3 3
  17. 浙江 嘉兴 4 4 4

2取TOPN数据

2.1 按照国家提取TOP3

2.1.1 样本数据:

  1. 国家 城市 Visitors
  2. 阿联酋,阿布扎比,137
  3. 阿联酋,阿布扎比,146
  4. 阿联酋,阿布扎比,178
  5. 阿联酋,阿布扎比,337
  6. 阿联酋,阿布扎比,178
  7. 阿联酋,阿布扎比,227
  8. 阿联酋,阿布扎比,157
  9. 阿联酋,迪拜,144
  10. 阿联酋,迪拜,268
  11. 阿联酋,迪拜,103
  12. 阿联酋,迪拜,141
  13. 阿联酋,迪拜,108
  14. 阿联酋,迪拜,266
  15. 澳大利亚,悉尼,141
  16. 澳大利亚,悉尼,122
  17. 澳大利亚,悉尼,153
  18. 澳大利亚,悉尼,128
  19. 澳大利亚,墨尔本,294
  20. 澳大利亚,墨尔本,230
  21. 澳大利亚,墨尔本,159
  22. 澳大利亚,墨尔本,188
  23. 澳大利亚,堪培拉,249
  24. 澳大利亚,堪培拉,378
  25. 澳大利亚,堪培拉,255
  26. 澳大利亚,堪培拉,240

2.1.2导入数据

  1. --执行下述语句
  2. hive (temp)> hive -f 'HQL/loaddata.hql'>out/tmp;
  3. -----------------------------------------------
  4. drop table temp.tripdata;
  5. CREATE table datatable (
  6. country string,
  7. city string,
  8. Visitors int)
  9. ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
  10. STORED AS TEXTFILE;
  11.  
  12. load data local inpath 'home/loaddata'
  13. overwrite into table temp.tripdata;
  14. ----------------------------------------------
  15.  
  16. ----------------------------------------------
  17. --查看结果
  18. hive (temp)> select * from tripdata;
  19. country city visitors
  20. 阿联酋 阿布扎比 137
  21. 阿联酋 阿布扎比 146
  22. 阿联酋 阿布扎比 178
  23. 阿联酋 阿布扎比 337
  24. 阿联酋 阿布扎比 178
  25. 阿联酋 阿布扎比 227
  26. 阿联酋 阿布扎比 157
  27. 阿联酋 迪拜 144
  28. 阿联酋 迪拜 268
  29. 阿联酋 迪拜 103
  30. 阿联酋 迪拜 141
  31. 阿联酋 迪拜 108
  32. 阿联酋 迪拜 266
  33. 澳大利亚 悉尼 141
  34. 澳大利亚 悉尼 122
  35. 澳大利亚 悉尼 153
  36. 澳大利亚 悉尼 128
  37. 澳大利亚 墨尔本 294
  38. 澳大利亚 墨尔本 230
  39. 澳大利亚 墨尔本 159
  40. 澳大利亚 墨尔本 188
  41. 澳大利亚 堪培拉 249
  42. 澳大利亚 堪培拉 378
  43. 澳大利亚 堪培拉 255
  44. 澳大利亚 堪培拉 240
  45. ---格式:select 品牌,count/sum/其它() as num from table_name order by num limit 10;
  46.  
  47. select country,city,visitors
  48. from tripdata
  49. order by visitors desc
  50. limit 5;
  51.  
  52. country city visitors
  53. 澳大利亚 堪培拉 378
  54. 阿联酋 阿布扎比 337
  55. 澳大利亚 墨尔本 294
  56. 阿联酋 迪拜 268
  57. 阿联酋 迪拜 266

2.2 按照国家、城市提取TOP3

  1. --取top10品牌下各品牌的top10渠道 ,格式:
  2. select
  3. a.*
  4. from
  5. (
  6. select 品牌,渠道,count/sum/其它() as num row_number() over (partition by 品牌 order by num desc ) rank
  7. from table_name
  8. where 品牌限制条件
  9. group by 品牌,渠道
  10. )a
  11. where a.rank<=10
  12. select a.*
  13. from (
  14. select country,city,visitors, row_number() over (partition by country order by visitors desc ) rank
  15. from tripdata
  16. order by country,visitors desc
  17. ) a
  18. where a.rank<=3;
  19.  
  20. --结果
  21. a.country a.city a.visitors a.rank
  22. 澳大利亚 堪培拉 378 1
  23. 澳大利亚 墨尔本 294 2
  24. 澳大利亚 堪培拉 255 3
  25. 阿联酋 阿布扎比 337 1
  26. 阿联酋 迪拜 268 2
  27. 阿联酋 迪拜 266 3

2.3 按照国家提取TOP5

  1. --取top10品牌下各品牌的top10渠道中各渠道的top10档期 ,格式:
  2. select a.*
  3. from
  4. (
  5. select 品牌,渠道,档期,count/sum/其它() as num row_number() over (partition by 品牌,渠道 order by num desc ) rank
  6. from table_name
  7. where 品牌,渠道 限制条件
  8. group by 品牌,渠道,档期
  9. )a
  10. where a.rank<=10
  11. select a.*
  12. from (
  13. select country,city,visitors, row_number() over (partition by city order by visitors desc ) rank
  14. from tripdata
  15. order by country,city,visitors desc
  16. ) a
  17. where a.rank<=3;
  18.  
  19. --结果
  20. a.country a.city a.visitors a.rank
  21. 澳大利亚 堪培拉 378 1
  22. 澳大利亚 堪培拉 255 2
  23. 澳大利亚 堪培拉 249 3
  24. 澳大利亚 墨尔本 294 1
  25. 澳大利亚 墨尔本 230 2
  26. 澳大利亚 墨尔本 188 3
  27. 澳大利亚 悉尼 153 1
  28. 澳大利亚 悉尼 141 2
  29. 澳大利亚 悉尼 128 3
  30. 阿联酋 迪拜 268 1
  31. 阿联酋 迪拜 266 2
  32. 阿联酋 迪拜 144 3
  33. 阿联酋 阿布扎比 337 1
  34. 阿联酋 阿布扎比 227 2
  35. 阿联酋 阿布扎比 178 3
  1.  

链接:https://www.jianshu.com/p/9802f3a035e1

Hive分组取Top K数据的更多相关文章

  1. Hive分组取Top N

    Hive在0.11.0版本开始加入了row_number.rank.dense_rank分析函数,可以查询分组排序后的top值   说明: row_number() over ([partition ...

  2. sql 分组取最新的数据sqlserver巧用row_number和partition by分组取top数据

    SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系 ...

  3. row_number和partition by分组取top数据

    分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...

  4. Spark 两种方法计算分组取Top N

    Spark 分组取Top N运算 大数据处理中,对数据分组后,取TopN是非常常见的运算. 下面我们以一个例子来展示spark如何进行分组取Top的运算. 1.RDD方法分组取TopN from py ...

  5. sql分组取第一条数据

    sq分组取第一条数据的一个方法: select * from ( select row_number() over(partition by ID order by ID) as rownum , * ...

  6. oracle 分组取第一行数据 ,查询sql语句

    oracle  分组取第一行数据 SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, t.* FR ...

  7. Hive分组取第一条记录

    需求 交易系统,财务要求维护每个用户首个交易完成的订单数据(首单表,可取每个用户交易完成时间最老的订单数据).举例: 简写版的表结构: 表数据: 则 财务希望汇总记录如下: uid order_id ...

  8. oracle 根据字段分组取第一条数据及rank函数说明

    当前有这样一个需求,根据外键对子表数据进行分组,取每组中的一条数据就行了,如图: 如:COMMANDID = 26的有两条,只取一条数据. sql语句: select * from(select SY ...

  9. c# 对List<T> 某字段排序,取TOP条数据

    //排序的对象里的字段数据准备 try { cmr.v4 = Double.Parse(cmr.v3) - Double.Parse(cmr.v2); } catch (Exception e) { ...

随机推荐

  1. [golang] Glide 包管理

    一.概述 golang的包管理工具有很多,本篇幅主要介绍glide进行包管理. 二.安装及命令介绍 go get github.com/Masterminds/glide glide create|i ...

  2. Java 打印程序设计实例

    3.1 打印文本 3.1.1 应用场景 假设我们需要打印一个窗体的某个文本编辑域(可能只有几行,也可能包含多页)的内容,并且每页最多打印 54 行,如何实现呢? 3.1.2 解决方法 基本思路如下:首 ...

  3. LeetCode263——Ugly Number

    Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers ...

  4. 乐观锁的一种实现方式—CAS

    线程安全 众所周知,Java是多线程的.但是,Java对多线程的支持其实是一把双刃剑.一旦涉及到多个线程操作共享资源的情况时,处理不好就可能产生线程安全问题.线程安全性可能是非常复杂的,在没有充足的同 ...

  5. 15个Spring的核心注释示例

    众所周知,Spring DI和Spring IOC是Spring Framework的核心概念.让我们从org.springframework.beans.factory.annotation和org ...

  6. 每日英语:5 Things to Know About Missing Malaysia Airlines Flight and Air Safety

    Malaysia Airlines Flight MH370, with 239 people aboard, lost contact early Saturday with the airline ...

  7. 关于emoji表情

    /** /* 表情编码 /* @param emoji:表情符号 **/ encodeEmoji: function (content) { var imgHtml = ""; v ...

  8. jquery改变元素上下排列的顺序

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. iOS 开发_..和self...的区别以及使用

    相信很多初学者对_和self.之间的区别并没有一个大致的认识,那么下面对两者的区别做一个简单的介绍: 至于重写set和get方法,简要说明一下,当我们使用@property这用法之后,系统便会自动给我 ...

  10. CTF中常见Web源码泄露总结

    目录00x1 .ng源码泄露 00x2  git源码泄露 00x3 .DS_Store文件泄漏 00x4 网站备份压缩文件 00x5 SVN导致文件泄露 00x6 WEB-INF/web.xml泄露  ...