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 基本 ...
随机推荐
- selenium启动firefox、ie、chrome各浏览器方法
1.启动firefox浏览器 a.如果你的本地firefox是默认路径安装的话,如下方式即可启动浏览器 WebDriver driver = new FirefoxDriver(); driver.g ...
- [SQL]SqL给局部变量赋值有两种方法
给局部变量赋值有两种方法: .SET @variable_name=value .SELECT @variable_name=value 两者的区别:SET赋值语句一般用于赋给变量一个指定的常量,SE ...
- PreparedStatement和Statment
使用Statment安全性差,存在SQL注入隐患 public static void main(String[] args) { Connection conn=null; Statement st ...
- android 图片叠加效果——两种方法
效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // 防止出现Immutable bitmap passed to Can ...
- 在linux中安装和卸载mysql
[安装] 已经获取到linux版本的mysql安装包,包括mysql的server(服务端)和client(客户端)的安装包,假设安装包为: MySQL-server-5.0.22-0.i386.rp ...
- 高校应该使用 Drupal 的10大理由
使用 Drupal 已经成为全球顶尖高校中的一种潮流,它已经被全球数以百计的院校选择并应用,无论是哈佛.斯坦福.杜克.布朗.罗格斯.剑桥.耶鲁还是其它众多知名高校,都已经选择 Drupal 作为它们理 ...
- matlab 椭圆方程拟合
拟合椭圆首先要知道各个点的坐标,然和带入如下公式: x = [59 136 58 137 57 137 56 137 55 138 54 139 53 140 52 141 51 142 51 143 ...
- python基础set
1.set set是一个无序的不重复的集合 li=[11,22,33,11] s=set(li) print(s) {11,22,33} set提供的方法 1.add(self, *args, ** ...
- sql server查询出的结果中添加一列序列行
select row_number()over(order by id) as rownum ,[UserName] ,[Password] ,[Mobile] ,[Email] ,[Sex] ,[C ...
- 二模07day2解题报告
T1.采药(medic) 有n个草药,要在m的时间内获得最大价值. 乍一看像是01背包,然而数据只能过50分. 考虑数据范围,t<=10,w<=10,所以只有121种草药.考虑多重背包的二 ...