Udostępnij za pośrednictwem


SORT BY klauzula

Dotyczy:zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime

Zwraca wiersze wyników posortowane w ramach każdej partycji Spark w określonej kolejności użytkownika.

Gdy dane są rozłożone na wiele partycji platformy Spark, SORT BY może zwrócić częściowo uporządkowany wynik. Aby jawnie kontrolować sposób podziału danych na partycje platformy Spark, użyj REPARTITION hint. Różni się to od klauzuli ORDER BY, która gwarantuje w pełni uporządkowane dane wyjściowe niezależnie od sposobu dzielenia danych przez platformę Spark.

Składnia

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

sort_direction
 [ ASC | DEC ]

nulls_sort_order
 [ NULLS FIRST | NULLS LAST ]

Parametry

  • wyrażenie

    Wyrażenie dowolnego typu używane do ustanowienia kolejności lokalnej partycji, w której są zwracane wyniki.

    Jeśli wyrażenie jest wartością literału INT, jest interpretowana jako pozycja kolumny na liście wyboru.

  • sort_direction

    Określa kolejność sortowania dla wyrażenia sortu.

    • ASC: kierunek sortowania dla tego wyrażenia jest rosnąco.
    • DESC: Kolejność sortowania dla tego wyrażenia jest malejąco.

    Jeśli kierunek sortowania nie jest jawnie określony, domyślnie wiersze są sortowane rosnąco.

  • nulls_sort_order

    Opcjonalnie określa, czy wartości NULL są zwracane przed/po wartościach innych niż NULL. Jeśli null_sort_order nie określono parametru , najpierw posortuj listy NULLs, jeśli kolejność sortowania to ASC , a sortowanie nulls ostatnie, jeśli kolejność sortowania to DESC.

    • NULLS FIRST: wartości NULL są zwracane najpierw niezależnie od kolejności sortowania.
    • NULLS LAST: wartości NULL są zwracane jako ostatnie niezależnie od kolejności sortowania.

Podczas określania więcej niż jednego sortowania wyrażeń następuje od lewej do prawej. Wszystkie wiersze w partycji platformy Spark są sortowane według pierwszego wyrażenia. Jeśli dla pierwszego wyrażenia istnieją zduplikowane wartości, drugie wyrażenie jest używane do rozpoznawania kolejności w grupie duplikatów itd. Wynikowa kolejność nie jest deterministyczna, jeśli istnieją zduplikowane wartości we wszystkich wyrażeniach kolejności.

Przykłady

> 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