Sdílet prostřednictvím


klauzule SORT BY

Platí pro:zaškrtnutí označeného ano Databricks SQL zaškrtnutí označeného ano Databricks Runtime

Vrátí řádky výsledků seřazené v rámci každého oddílu Sparku v zadaném pořadí uživatele.

Když jsou data rozložená do několika oddílů Sparku, SORT BY může vrátit částečně uspořádaný výsledek. K explicitní kontrole způsobu rozdělení dat do oddílů Sparku použijte REPARTITION hint. Liší se od klauzule ORDER BY, která zaručuje plně seřazený výstup bez ohledu na to, jak Spark rozdělí data.

Syntaxe

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

sort_direction
 [ ASC | DEC ]

nulls_sort_order
 [ NULLS FIRST | NULLS LAST ]

Parametry

  • výraz

    Výraz libovolného typu sloužící k určení lokálního pořadí v rámci oddílu, ve kterém jsou výsledky vraceny.

    Pokud je výraz literálovou hodnotou INT, interpretuje se jako pozice sloupce v seznamu select.

  • sort_direction

    Určuje pořadí řazení pro řazení podle výrazu.

    • ASC: Směr řazení pro tento výraz je vzestupný.
    • DESC: Pořadí řazení pro tento výraz je sestupné.

    Pokud není explicitně zadán směr řazení, jsou ve výchozím nastavení řádky seřazeny vzestupně.

  • nulls_sort_order

    Volitelně určuje, jestli se hodnoty NULL vrátí před nebo za hodnotami, které nejsou null. Pokud null_sort_order není zadáno, hodnoty NULLs se seřadí jako první, pokud je ASC pořadí řazení a hodnota NULLS seřadí jako poslední, pokud je DESCpořadí řazení .

    • NULLS FIRST: Hodnoty NULL se vrátí jako první bez ohledu na pořadí řazení.
    • NULLS LAST: Hodnoty NULL se vrátí jako poslední bez ohledu na pořadí řazení.

Při zadávání více než jednoho řazení výrazů dochází zleva doprava. Všechny řádky v oddílu Spark jsou seřazené podle prvního výrazu. Pokud jsou u prvního výrazu duplicitní hodnoty, použije se druhý výraz k určení pořadí ve skupině duplicit a podobně. Výsledné pořadí není deterministické, pokud existují duplicitní hodnoty napříč všemi pořadími podle výrazů.

Příklady

> 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