注意 hive 的hsql没有 top n这个功能,不像sql。

所以实现top n如下:

我想说的SELECT TOP N是取最大前N条或者最小前N条。

Hive提供了limit关键字,再配合order by可以很容易地实现SELECT
TOP N。

但是在Hive中order by只能使用1个reduce,如果表的数据量很大,那么order
by就会力不从心。

例如我们执行SQL:select a from ljntest01 order by a limit
10;

控制台会打印出:Number of reduce tasks determined at compile time: 1

说明启动的reduce数量是编译时确定的。

查看该SQL的执行计划,该SQL只启动1个JOB。

假设数据表有1亿条数据,而我们只想取TOP
10,那对1亿条数据在1个reduce中做全排序是非常不合理的。

幸好有sort by,使用sort by替换order
by就可以解决这个问题:

select a from ljntest01 sort by a limit 10;

首先执行该SQL控制台打印出:Number of reduce tasks not specified.
Estimated from input data size: 1

说明reduce数不是编译时确定的,而是根据输入文件大小动态确定的。

此外查看该SQL的执行计划:

STAGE DEPENDENCIES:

Stage-1 is a root stage

Stage-2 depends on stages: Stage-1

Stage-0 is a root stage

STAGE PLANS:

Stage: Stage-1

Map Reduce

Alias -> Map Operator Tree:

ljntest01

TableScan

alias: ljntest01

Select Operator

expressions:

expr: a

type: int

outputColumnNames: _col0

Reduce Output Operator

key expressions:

expr: _col0

type: int

sort order: +

tag: -1

value expressions:

expr: _col0

type: int

Reduce Operator Tree:

Extract

Limit

File Output Operator

compressed: true

GlobalTableId: 0

table:

input format: org.apache.hadoop.mapred.SequenceFileInputFormat

output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

Stage: Stage-2

Map Reduce

Alias -> Map Operator Tree:

hdfs://hdpnn:9000/group/alidw-cbu/tmp/hive-admin/hive_2012-12-16_01-19-42_893_2878471909568139281/-mr-10002

Reduce Output Operator

key expressions:

expr: _col0

type: int

sort order: +

tag: -1

value expressions:

expr: _col0

type: int

Reduce Operator Tree:

Extract

Limit

File Output Operator

compressed: true

GlobalTableId: 0

table:

input format: org.apache.hadoop.mapred.TextInputFormat

output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat

Stage: Stage-0

Fetch Operator

limit: 10

sort by可以启动多个reduce,每个reduce做局部排序,但是这对于sort
by limit N已经够用了。从执行计划中可以看出sort by limit N启动了两个JOB。第一个JOB是在每个reduce中做局部排序,然后分别取TOP
N。假设启动了M个reduce,第二个JOB再对M个reduce分别局部排好序的总计M
* N条数据做全局排序,取TOP N,从而得到想要的结果。这样就可以大大提高SELECT TOP
N的效率。

最新文章

  1. eclipse中搭建svn开发管理环境
  2. 快速卸载VS2015的办法
  3. 1 mysql的安装
  4. Linux命令的类型
  5. Linux Commands intro1
  6. Linux MD5值递归比对目录中的文件是否有修改
  7. IIS 发布后文件拒绝访问
  8. Android提供了5种方式存储数据:
  9. HDU 4658 Integer Partition(整数拆分)
  10. BZOJ 1036 树的统计
  11. asp.net中TextBox里面实现回车触发指定事件
  12. Vue阻止冒泡
  13. win10 UWP 获取系统信息
  14. 微服务架构-选择Spring Cloud,放弃Dubbo
  15. 2017.11.19 C语言基础及流水灯实现
  16. [转]Google的C++代码规范
  17. day44-Celery异步分布式
  18. 洛谷 P1061 Jam的计数法
  19. 如何将PDF文件转Word,有什么方法
  20. shell 脚本的时间差计算

热门文章

  1. django.db.utils.ProgrammingError: 1146 的解决办法
  2. SQL语句常见DDL/DML/DCL操作部分试题(一)
  3. 单页应用动态设置页面title
  4. 关于centos版本安装ethereum钱包
  5. Node.js 定时器
  6. sorted函数返回一个新的列表就安全了吗?
  7. Zookeeper的安装配置及基本开发
  8. arm-none-eabi-g++ -Xlinker -T "../LF3Kmonitor.ld" -Xlinker -Map="Bogota_ICT_V.map"-ram-hosted.ld -mc
  9. Android Multimedia框架总结(十九)Camera2框架C/S模型之CameraService启动及与Client连接过程
  10. (一)ROS系统入门 Getting Started with ROS 以Kinetic为主更新 附课件PPT