提示
Spark SQL 教程 正在筹划编写中,使用过程中有任何建议,提供意见、建议、纠错、催更加微信 gairuo123。
SORT BY 子句用于返回按用户指定顺序在每个分区内排序的结果行。当有多个分区时,SORT BY 可能返回部分排序的结果。这与 ORDER BY 子句不同,后者保证输出的总顺序。
SORT BY 子句语法:
SORT BY { expression [ sort_direction | nulls_sort_order ] [ , ... ] }
参数有:
指定以逗号分隔的表达式列表以及可选参数 sort_direction 和 nulls_sort_order,用于对每个分区中的行进行排序。
(可选)指定是按升序还是降序对行进行排序。排序方向的有效值是ASC(升序)和DESC(降序)。如果未明确指定排序方向,则默认情况下,行按升序排序。
语法: [ ASC | DESC ]
(可选)指定是否在非空值之前/之后返回空值。如果未指定 null_sort_order,则如果排序顺序为 ASC,则首先为 null 排序;如果排序顺序为 DESC,则最后为 null 排序。
语法: [ NULLS { FIRST | LAST } ]
相关使用示例为:
CREATE TABLE person (zip_code INT, name STRING, age INT);
INSERT INTO person VALUES
(94588, 'Zen Hui', 50),
(94588, 'Dan Li', 18),
(94588, 'Anil K', 27),
(94588, 'John V', NULL),
(94511, 'David K', 42),
(94511, 'Aryan B.', 18),
(94511, 'Lalit B.', NULL);
-- 使用 'REPARTITION' 提示按 'zip_code' 对数据进行分区,
-- 以检查 'SORT by' 行为。这在其余的示例中使用。
-- 在每个分区内按 “name” 以升序方式对行进行排序
SELECT /*+ REPARTITION(zip_code) */ name, age, zip_code FROM person SORT BY name;
+--------+----+--------+
| name| age|zip_code|
+--------+----+--------+
| Anil K| 27| 94588|
| Dan Li| 18| 94588|
| John V|null| 94588|
| Zen Hui| 50| 94588|
|Aryan B.| 18| 94511|
| David K| 42| 94511|
|Lalit B.|null| 94511|
+--------+----+--------+
-- 使用列位置对每个分区内的行进行排序。
SELECT /*+ REPARTITION(zip_code) */ name, age, zip_code FROM person SORT BY 1;
+--------+----+--------+
| name| age|zip_code|
+--------+----+--------+
| Anil K| 27| 94588|
| Dan Li| 18| 94588|
| John V|null| 94588|
| Zen Hui| 50| 94588|
|Aryan B.| 18| 94511|
| David K| 42| 94511|
|Lalit B.|null| 94511|
+--------+----+--------+
-- 以升序方式对分区内的行进行排序,将空值保留为最后一个。
SELECT /*+ REPARTITION(zip_code) */ age, name, zip_code FROM person SORT BY age NULLS LAST;
+----+--------+--------+
| age| name|zip_code|
+----+--------+--------+
| 18| Dan Li| 94588|
| 27| Anil K| 94588|
| 50| Zen Hui| 94588|
|null| John V| 94588|
| 18|Aryan B.| 94511|
| 42| David K| 94511|
|null|Lalit B.| 94511|
+----+--------+--------+
-- 在每个分区内按年龄以降序方式对行进行排序,默认为 NULL LAST。
SELECT /*+ REPARTITION(zip_code) */ age, name, zip_code FROM person SORT BY age DESC;
+----+--------+--------+
| age| name|zip_code|
+----+--------+--------+
| 50| Zen Hui| 94588|
| 27| Anil K| 94588|
| 18| Dan Li| 94588|
|null| John V| 94588|
| 42| David K| 94511|
| 18|Aryan B.| 94511|
|null|Lalit B.| 94511|
+----+--------+--------+
-- 在每个分区内,按时间以降序方式对行进行排序,将空值放在第一位。
SELECT /*+ REPARTITION(zip_code) */ age, name, zip_code FROM person SORT BY age DESC NULLS FIRST;
+----+--------+--------+
| age| name|zip_code|
+----+--------+--------+
|null| John V| 94588|
| 50| Zen Hui| 94588|
| 27| Anil K| 94588|
| 18| Dan Li| 94588|
|null|Lalit B.| 94511|
| 42| David K| 94511|
| 18|Aryan B.| 94511|
+----+--------+--------+
-- 基于多个列对每个分区内的行进行排序,每个列具有不同的排序方向。
SELECT /*+ REPARTITION(zip_code) */ name, age, zip_code FROM person
SORT BY name ASC, age DESC;
+--------+----+--------+
| name| age|zip_code|
+--------+----+--------+
| Anil K| 27| 94588|
| Dan Li| 18| 94588|
| John V|null| 94588|
| Zen Hui| 50| 94588|
|Aryan B.| 18| 94511|
| David K| 42| 94511|
|Lalit B.|null| 94511|
+--------+----+--------+
更新时间:2021-07-29 23:10:29 标签:spark sql sortby