hive的top n
注意 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的效率。
最新文章
- eclipse中搭建svn开发管理环境
- 快速卸载VS2015的办法
- 1 mysql的安装
- Linux命令的类型
- Linux Commands intro1
- Linux MD5值递归比对目录中的文件是否有修改
- IIS 发布后文件拒绝访问
- Android提供了5种方式存储数据:
- HDU 4658 Integer Partition(整数拆分)
- BZOJ 1036 树的统计
- asp.net中TextBox里面实现回车触发指定事件
- Vue阻止冒泡
- win10 UWP 获取系统信息
- 微服务架构-选择Spring Cloud,放弃Dubbo
- 2017.11.19 C语言基础及流水灯实现
- [转]Google的C++代码规范
- day44-Celery异步分布式
- 洛谷 P1061 Jam的计数法
- 如何将PDF文件转Word,有什么方法
- shell 脚本的时间差计算
热门文章
- django.db.utils.ProgrammingError: 1146 的解决办法
- SQL语句常见DDL/DML/DCL操作部分试题(一)
- 单页应用动态设置页面title
- 关于centos版本安装ethereum钱包
- Node.js 定时器
- sorted函数返回一个新的列表就安全了吗?
- Zookeeper的安装配置及基本开发
- arm-none-eabi-g++ -Xlinker -T ";../LF3Kmonitor.ld"; -Xlinker -Map=";Bogota_ICT_V.map";-ram-hosted.ld -mc
- Android Multimedia框架总结(十九)Camera2框架C/S模型之CameraService启动及与Client连接过程
- (一)ROS系统入门 Getting Started with ROS 以Kinetic为主更新 附课件PPT