Hive中ORDER BY语句和其他的SQL方言中的定义是一样的,会对查询结果集执行一个全局排序。这也就是说会有一个所有的数据都通过一个reduce进行处理的过程。对于大数据集,这个过程可能会消耗漫长的时间来执行,甚至会执行失败。不过这点并不用太过担心,因为大多数时候都不会有需求要对大数据集进行paixu用户可以指定任意期望进行排序的字段,并可以在字段后面加上ASC关键字(默认的),表示按升序排序,或加DESC关键字,表示按降序排序。
ORDER BY表示按照某些字段排序,语法如下,[ ]中的语句为可选项:
SELECT 列名
,aggregate_function(列名) AS num
FROM 表名
WHERE 列名 运算符 值 [AND 列名 运算符 值] [OR 列名 运算符 值]
GROUP BY 列名
HAVING num 运算符 值 [AND 列名 运算符 值] [OR 列名 运算符 值]
ORDER BY 列名 [desc];
使用ORDER BY需要注意:
在入门篇(十三)中我们曾介绍过Hive的严格模式,是通过set hive.mapred.mode=strict;来设定。而且为了防止员工误操作,在互联网公司中大多都会将此参数设为严格模式。此参数同样对ORDER BY的使用有影响。如果在strict模式下使用ORDER BY语句,那么必须要在语句中加上LIMIT关键字,因为执行ORDER BY的时候只能启动单个reduce,如果排序的结果集过大,那么执行时间会非常漫长。
查看当前模式是否为严格模式,如果不是设置为严格模式
hive (app)> set hive.mapred.mode;
hive.mapred.mode=nonstrict
hive (app)> set hive.mapred.mode=strict;
hive (app)> set hive.mapred.mode;
hive.mapred.mode=strict
对表t_od_use_cnt按使用次数升序排序,不加limit关键字,查看报错,如下:
SELECT *
FROM app.t_od_use_cnt
WHERE date_8 = 20190101
ORDER BY use_cnt;
hive (app)> SELECT *
> FROM app.t_od_use_cnt
> WHERE date_8 >= 20190101
> ORDER BY use_cnt;
FAILED: SemanticException 4:9 In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'use_cnt'
查看表t_od_use_cnt中使用次数(去重后)最大的5个次数,如下:
SELECT use_cnt
FROM app.t_od_use_cnt
WHERE date_8 = 20190101
GROUP BY use_cnt
ORDER BY use_cnt DESC LIMIT 5;
hive (app)> SELECT use_cnt
> FROM app.t_od_use_cnt
> WHERE date_8 = 20190101
> GROUP BY use_cnt
> ORDER BY use_cnt DESC LIMIT 5;
use_cnt
50
49
48
47
46
查询表t_od_use_cnt中,先平台升序,后版本降序的10条记录,如下:
SELECT platform
,app_version
FROM app.t_od_use_cnt
WHERE date_8 = 20190101
GROUP BY platform
,app_version
ORDER BY platform
,app_version DESC LIMIT 10;
hive (app)> SELECT platform
> ,app_version
> FROM app.t_od_use_cnt
> WHERE date_8 = 20190101
> GROUP BY platform
> ,app_version
> ORDER BY platform
> ,app_version DESC LIMIT 10;
platform app_version
1 1.5
1 1.4
1 1.3
1 1.2
1 1.1
2 1.5
2 1.4
2 1.3
2 1.2
2 1.1
Hive为了防止数据量过大时全局排序导致的执行时间过长或执行失败,提供了另外几种排序语句:DISTRIBUTE BY、SORT BY、CLUSTER BY。但老实说,我在工作中从来没有用到过,所以这里就不多介绍了,感兴趣的同学可以自行百度。
能看到这里的同学,就右上角点个赞顺便关注我吧,3Q~