Hive零基础从入门到实战 入门篇(十六) HiveQL:ORDER BY语句

目录

 

前言

1. 基本语法

2. 参数设置

3. 举例


 

前言

Hive中ORDER BY语句和其他的SQL方言中的定义是一样的,会对查询结果集执行一个全局排序。这也就是说会有一个所有的数据都通过一个reduce进行处理的过程。对于大数据集,这个过程可能会消耗漫长的时间来执行,甚至会执行失败。不过这点并不用太过担心,因为大多数时候都不会有需求要对大数据集进行paixu用户可以指定任意期望进行排序的字段,并可以在字段后面加上ASC关键字(默认的),表示按升序排序,或加DESC关键字,表示按降序排序。

 

1. 基本语法

ORDER BY表示按照某些字段排序,语法如下,[ ]中的语句为可选项:

SELECT 列名
      ,aggregate_function(列名) AS num
FROM 表名
WHERE 列名 运算符 值 [AND 列名 运算符 值] [OR 列名 运算符 值]
GROUP BY 列名
HAVING num 运算符 值 [AND 列名 运算符 值] [OR 列名 运算符 值]
ORDER BY 列名 [desc];

使用ORDER BY需要注意:

  • ORDER BY永远只能在查询语句的最后;
  • ORDER BY可以对多个字段进行排序,按照字段的顺序进行依次排序;
  • 默认是从小到大升序排序,每个字段后面都可以加DESC关键字,表示对该字段进行降序排序;
  • ORDER BY是全局排序,会有一个所有的数据都通过一个REDUCE进行处理的过程,十分影响运行效率;
  • ORDER BY中可以使用SELECT语句中用户自定义的列别名。

 

2. 参数设置

在入门篇(十三)中我们曾介绍过Hive的严格模式,是通过set hive.mapred.mode=strict;来设定。而且为了防止员工误操作,在互联网公司中大多都会将此参数设为严格模式。此参数同样对ORDER BY的使用有影响。如果在strict模式下使用ORDER BY语句,那么必须要在语句中加上LIMIT关键字,因为执行ORDER BY的时候只能启动单个reduce,如果排序的结果集过大,那么执行时间会非常漫长。

 

3. 举例

查看当前模式是否为严格模式,如果不是设置为严格模式

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~

你可能感兴趣的:(Hive零基础从入门到实战 入门篇(十六) HiveQL:ORDER BY语句)