Поделиться через


предложение SORT BY

Область применения:флажок Databricks SQL флажок Databricks Runtime

Возвращает строки результатов, отсортированные в каждой секции Spark в указанном пользователе порядке.

Если данные распределяется по нескольким секциям Spark, SORT BY может вернуть частично упорядоченный результат. Чтобы явно контролировать разделение данных на секции Spark, используйте REPARTITION hint. Это отличается от предложения ORDER BY, которое гарантирует полностью упорядоченные выходные данные независимо от того, как Spark разделяет данные.

Синтаксис

SORT BY { expression [ sort_direction nulls_sort_oder ] } [, ...]

sort_direction
 [ ASC | DEC ]

nulls_sort_order
 [ NULLS FIRST | NULLS LAST ]

Параметры

  • выражение

    Выражение любого типа, используемое для установления локального порядка разбиения, в котором возвращаются результаты.

    Если выражение является литеральным значением INT, оно интерпретируется как позиция столбца в списке выбора.

  • sort_direction

    Указывает порядок сортировки для выражения SORT BY.

    • ASC: направление сортировки "по возрастанию" для этого выражения.
    • DESC: направление сортировки "по убыванию" для этого выражения.

    Если направление сортировки не указано явно, по умолчанию строки сортируются по возрастанию.

  • nulls_sort_order

    При необходимости указывает, возвращаются ли значения NULL до или после значений, отличных от NULL. Если параметр null_sort_order не указан, то значения NULL сортируются в начале, когда порядок сортировки имеет значение ASC, или в конце, когда для порядка сортировки задано значение DESC.

    • NULLS FIRST: значения NULL возвращаются сначала независимо от порядка сортировки.
    • NULLS LAST: значения NULL возвращаются последними независимо от порядка сортировки.

Если указано несколько выражений для сортировки, они применяются в порядке слева направо. Все строки в секции Spark отсортированы по первому выражению. Если для первого выражения есть повторяющиеся значения, то используется второе выражение для разрешения порядка в группе дублирующихся значений, и так далее. Результирующий порядок не детерминирован, если между всеми выражениями имеются повторяющиеся значения.

Примеры

> CREATE TEMP VIEW person (zip_code, name, age)
    AS 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);

-- Use `REPARTITION` hint to partition the data by `zip_code` to
-- examine the `SORT BY` behavior. This is used in rest of the
-- examples.

-- Sort rows by `name` within each partition in ascending manner
> SELECT /*+ REPARTITION(zip_code) */ name, age, zip_code FROM person
    SORT BY name;
   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

-- Sort rows within each partition using column position.
> SELECT /*+ REPARTITION(zip_code) */ name, age, zip_code FROM person
    SORT BY 1;
   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

-- Sort rows within partition in ascending manner keeping null values to be last.
> SELECT /*+ REPARTITION(zip_code) */ age, name, zip_code FROM person
    SORT BY age NULLS LAST;
   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

-- Sort rows by age within each partition in descending manner, which defaults to NULL LAST.
> SELECT /*+ REPARTITION(zip_code) */ age, name, zip_code FROM person
    SORT BY age DESC;
   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

-- Sort rows by age within each partition in descending manner keeping null values to be first.
> SELECT /*+ REPARTITION(zip_code) */ age, name, zip_code FROM person
    SORT BY age DESC NULLS FIRST;
 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

-- Sort rows within each partition based on more than one column with each column having
-- different sort direction.
> SELECT /*+ REPARTITION(zip_code) */ name, age, zip_code FROM person
    SORT BY name ASC, age DESC;
   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