Hive中的排序语法
ORDER BY
hive中的ORDER BY语句和关系数据库中的sql语法相似。他会对查询结果做全局排序,这意味着所有的数据会传送到一个Reduce任务上,这样会导致在大数量的情况下,花费大量时间。
与数据库中 ORDER BY 的区别在于在hive.mapred.mode = strict模式下,必须指定 limit 否则执行会报错。
hive> set hive.mapred.mode=strict;
hive> select * from test order by id;
FAILED: SemanticException : In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'id' 例子: hive> set hive.mapred.mode=unstrict;
hive> select * from test order BY id ;
MapReduce Jobs Launched:
Job : Map: Reduce: Cumulative CPU: 1.88 sec HDFS Read: HDFS Write: SUCCESS
Total MapReduce CPU Time Spent: seconds msec
OK
a
a
b
b
c
c
d
d
Time taken: 24.609 seconds, Fetched: row(s)
从上面的日志可以看到:启动了一个reduce进行全局排序。
SORT BY
SORT BY不是全局排序,其在数据进入reducer前完成排序,因此在有多个reduce任务情况下,SORT BY只能保证每个reduce的输出有序,而不能保证全局有序。
注意:hive要求DISTRIBUTE BY语句出现在SORT BY语句之前。
你可以通过设置mapred.reduce.tasks的值来控制reduce的数,然后对reduce输出的结果做二次排序。
例子:
hive> set mapred.reduce.tasks=;
hive> select * from test sort BY id ;
MapReduce Jobs Launched:
Job : Map: Reduce: Cumulative CPU: 4.48 sec HDFS Read: HDFS Write: SUCCESS
Total MapReduce CPU Time Spent: seconds msec
OK
a
b
c
d
b
c
d
a
Time taken: 29.574 seconds, Fetched: row(s)
从上面的日志可以看到:启动了三个reduce分别排序,最后的结果不是有序的。
DISTRIBUTE BY with SORT BY
DISTRIBUTE BY能够控制map的输出在reduce中如何划分。其可以按照指定的字段对数据进行划分到不同的输出reduce/文件中。
DISTRIBUTE BY和GROUP BY有点类似,DISTRIBUTE BY控制reduce如何处理数据,而SORT BY控制reduce中的数据如何排序。
注意:hive要求DISTRIBUTE BY语句出现在SORT BY语句之前。
例子:
hive> select * from test distribute BY id sort by id asc;
Job : Map: Reduce: Cumulative CPU: 4.24 sec HDFS Read: HDFS Write: SUCCESS
Total MapReduce CPU Time Spent: seconds msec
OK
c
c
a
a
d
d
b
b
Time taken: 29.89 seconds, Fetched: row(s)
从上面的日志可以看到:启动了三个reduce分别排序,最后的结果不是有序的。
CLUSTER BY来代替
当DISTRIBUTE BY的字段和SORT BY的字段相同时,可以用CLUSTER BY来代替 DISTRIBUTE BY with SORT BY。
注意:CLUSTER BY不能添加desc或者asc。
例子:
hive> select * from test cluster by id asc;
FAILED: ParseException line : extraneous input 'asc' expecting EOF near '<EOF>' hive> select * from test cluster by id ;
MapReduce Jobs Launched:
Job : Map: Reduce: Cumulative CPU: 4.58 sec HDFS Read: HDFS Write: SUCCESS
Total MapReduce CPU Time Spent: seconds msec
OK
c
c
a
a
d
d
b
b
Time taken: 30.646 seconds, Fetched: row(s)
从上面的日志可以看到:启动了三个reduce分别排序,最后的结果不是有序的。
怎样让最后的结果是有序的呢?
可以这样做:
hive> select a.* from (select * from test cluster by id ) a order by a.id ;
MapReduce Jobs Launched:
Job : Map: Reduce: Cumulative CPU: 4.5 sec HDFS Read: HDFS Write: SUCCESS
Job : Map: Reduce: Cumulative CPU: 1.96 sec HDFS Read: HDFS Write: SUCCESS
Total MapReduce CPU Time Spent: seconds msec
OK
a
a
b
b
c
c
d
d
Time taken: 118.261 seconds, Fetched: row(s)
总结
- ORDER BY是全局排序,但在数据量大的情况下,花费时间会很长
- SORT BY是将reduce的单个输出进行排序,不能保证全局有序
- DISTRIBUTE BY可以按指定字段将数据划分到不同的reduce中
- 当DISTRIBUTE BY的字段和SORT BY的字段相同时,可以用CLUSTER BY来代替 DISTRIBUTE BY with SORT BY。
Hive中的排序语法的更多相关文章
- Hive中的排序和分组(对map和reduce的影响,值得一看!)
order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规 模较大时,需要较长的计算时间. set ...
- Hadoop Hive 中的排序 Order by ,Sort by ,Distribute by以及 Cluster By
order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间. set h ...
- hive中的全排序
写mapreduce程序时,如果reduce个数>1,想要实现全排序需要控制好map的输出 现在学了Hive,写sql大家都很熟悉,如果一个order by解决了全排序还用那么麻烦写mapred ...
- mysql分组排序取最大值所在行,类似hive中row_number() over partition by
如下图, 计划实现 :按照 parent_code 分组, 取组中code最大值所在的整条记录,如红色部分.(类似hive中: row_number() over(partition by)) sel ...
- [大数据相关] Hive中的全排序:order by,sort by, distribute by
写mapreduce程序时,如果reduce个数>1,想要实现全排序需要控制好map的输出,详见Hadoop简单实现全排序. 现在学了hive,写sql大家都很熟悉,如果一个order by解决 ...
- Hive 中的四种排序详解,再也不会混淆用法了
Hive 中的四种排序 排序操作是一个比较常见的操作,尤其是在数据分析的时候,我们往往需要对数据进行排序,hive 中和排序相关的有四个关键字,今天我们就看一下,它们都是什么作用. 数据准备 下面我们 ...
- Hive 中Join的专题---Join详解
1.什么是等值连接? 2.hive转换多表join时,如果每个表在join字句中,使用的都是同一个列,该如何处理? 3.LEFT,RIGHT,FULL OUTER连接的作用是什么? 4.LEFT或RI ...
- HIVE中的order by操作
hive中常见的高级查询包括:group by.Order by.join.distribute by.sort by.cluster by.Union all.今天我们来看看order by操作,O ...
- 第2节 hive基本操作:12、hive当中的hql语法
3.2. hive查询语法 3.2.1.SELECT https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select 基本 ...
随机推荐
- jquery mobile导致无法修改textarea的高度
在引用了jquery mobile的js库和样式的页面中,添加textarea标签,会导致无法调整其height属性,不管是用CSS还是JS,最终都会被替换成height=52px 解决办法:在页面中 ...
- turing 项目引用
1.友盟自动更新 2.友盟统计 3.友盟消息推送 http://www.bejson.com/json2javapojo/ 引用bejson 解析JSON生成类,数组 private List< ...
- Nginx作为静态内容服务器(Windows环境)
1.简单安装 1)下载 http://nginx.org/en/download.html 2)解压后的路径 E:\Study\nginx\nginx-1.7.6 3)执行nginx.exe,访问ht ...
- JSP SQL注入--破法
1.JS验证拦截 <%@ page language="java" import="java.util.*" pageEncoding="UTF ...
- C#(Visual Studio) AssemblyInfo
AssemblyInfo .NET Project的Properties文件夹下会自动生成一个AssemblyInfo.cs的文件,该文件包含的信息和项目->右键->属性->Appl ...
- 慕课网-安卓工程师初养成-3-2 Java中的算术运算符
来源:http://www.imooc.com/code/1279 算术运算符主要用于进行基本的算术运算,如加法.减法.乘法.除法等. Java 中常用的算术运算符: 其中,++ 和 -- 既可以出现 ...
- 查看linux占用内存/CPU最多的进程
可以使用一下命令查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 可以使用一下命令查使用CPU最多的10个进程 ps -aux | sort -k3nr ...
- MapReduce和Tez对比
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)". Tez是Apache开源的支持D ...
- 关于SVN更新时文件加锁的小结
今天使用SVN更新应用,出现了下面的问题: update D:/workspace/acode/resource/springconf -r 6622 --force Attempted to ...
- 用代码给TABLE 添加字段,设置属性并编译
AOTTableFieldList AOTTableFieldList ,TableFieldNode; TableName tableName = "SML_InventTableExt& ...