Udostępnij za pośrednictwem


Wskazówki

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

Zasugeruj konkretne podejścia do generowania planu wykonania.

Składnia

/*+ { partition_hint | join_hint | skew_hint } [, ...] */

Wskazówki dotyczące partycjonowania

Wskazówki dotyczące partycjonowania pozwalają zasugerować strategię partycjonowania, której Azure Databricks powinno się trzymać. COALESCE, REPARTITION i REPARTITION_BY_RANGE to obsługiwane wskazówki, które są równoważne odpowiednio interfejsom API coalesce, repartition i repartitionByRange zestawów danych. Te wskazówki umożliwiają dostosowanie wydajności i kontrolowania liczby plików wyjściowych. W przypadku określenia wielu wskazówek partycjonowania wiele węzłów jest wstawionych do planu logicznego, ale najbardziej lewa wskazówka jest wybierana przez optymalizator.

Składnia

partition_hint
  COALESCE ( part_num ) |
  REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } ) |
  REPARTITION_BY_RANGE ( column_name [, ...] [, part_num] ) |
  REBALANCE [ ( column_name [, ...] ) ]

Typy wskazówek dotyczących partycjonowania

  • COALESCE ( part_num )

    Zmniejsz liczbę partycji do określonej liczby partycji. Przyjmuje numer partycji jako parametr.

  • REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } )

    Ponowne partycjonowanie na określoną liczbę partycji, korzystając z określonych wyrażeń partycjonowania. Przyjmuje numer partycji, nazwy kolumn lub oba parametry.

  • REPARTITION_BY_RANGE ( column_name [, ...] [, part_num]

    Ponowne partycjonowanie do określonej liczby partycji przy użyciu określonych wyrażeń partycjonowania. Przyjmuje nazwy kolumn i opcjonalny numer partycji jako parametry.

  • REBALANCE [ ( column_name [, ...] ) ]

    Wskazówka REBALANCE może służyć do ponownego równoważenia partycji wyjściowych wyników zapytania, dzięki czemu każda partycja ma rozsądny rozmiar (nie jest zbyt mały i nie zbyt duży). Może ona przyjmować nazwy kolumn jako parametry i jak najlepiej partycjonować wyniki zapytania według tych kolumn. Jest to najlepsze rozwiązanie: jeśli istnieją niesymetryczności, platforma Spark podzieli niesymetryczne partycje, aby te partycje nie były zbyt duże. Ta wskazówka jest przydatna, gdy trzeba napisać wynik tego zapytania do tabeli, aby uniknąć zbyt małych/dużych plików. Ta wskazówka jest ignorowana, jeśli usługa AQE nie jest włączona.

  • column_name

    Widoczna nazwa kolumny lub aliasu do ponownego partycjonowania lub równoważenia.

  • part_num

    Literał liczby całkowitej. Liczba partycji, do których ma nastąpić ponowne partycjonowanie.

Przykłady

> SELECT /*+ COALESCE(3) */ * FROM t;

> SELECT /*+ REPARTITION(3) */ * FROM t;

> SELECT /*+ REPARTITION(c) */ * FROM t;

> SELECT /*+ REPARTITION(3, c) */ * FROM t;

> SELECT /*+ REPARTITION_BY_RANGE(c) */ * FROM t;

> SELECT /*+ REPARTITION_BY_RANGE(3, c) */ * FROM t;

> SELECT /*+ REBALANCE */ * FROM t;

> SELECT /*+ REBALANCE(c) */ * FROM t;

-- When a column name has been occluded by an alias you must refere to it by the alias name.
> SELECT /*+ REBALANCE(d) */ * FROM t AS s(d);

-- multiple partitioning hints
> EXPLAIN EXTENDED SELECT /*+ REPARTITION(100), COALESCE(500), REPARTITION_BY_RANGE(3, c) */ * FROM t;
== Parsed Logical Plan ==
'UnresolvedHint REPARTITION, [100]
+- 'UnresolvedHint COALESCE, [500]
   +- 'UnresolvedHint REPARTITION_BY_RANGE, [3, 'c]
      +- 'Project [*]
         +- 'UnresolvedRelation [t]

== Analyzed Logical Plan ==
name: string, c: int
Repartition 100, true
+- Repartition 500, false
   +- RepartitionByExpression [c#30 ASC NULLS FIRST], 3
      +- Project [name#29, c#30]
         +- SubqueryAlias spark_catalog.default.t
            +- Relation[name#29,c#30] parquet

== Optimized Logical Plan ==
Repartition 100, true
+- Relation[name#29,c#30] parquet

== Physical Plan ==
Exchange RoundRobinPartitioning(100), false, [id=#121]
+- *(1) ColumnarToRow
   +- FileScan parquet default.t[name#29,c#30] Batched: true, DataFilters: [], Format: Parquet,
      Location: CatalogFileIndex[file:/spark/spark-warehouse/t], PartitionFilters: [],
      PushedFilters: [], ReadSchema: struct<name:string>

Wskazówki dotyczące sprzężenia

Podpowiedzi dotyczące łączenia umożliwiają zasugerowanie strategii łączenia, której powinien użyć Databricks SQL. Gdy różne wskazówki dotyczące strategii sprzężenia są określone po obu stronach sprzężenia, usługa Databricks SQL określa priorytety wskazówek w następującej kolejności: BROADCAST ponad MERGE ponad SHUFFLE_HASH ponad SHUFFLE_REPLICATE_NL. Gdy obie strony są określone za pomocą wskazówki BROADCAST lub SHUFFLE_HASH, Databricks SQL wybiera stronę do budowy na podstawie typu sprzężenia i rozmiarów relacji. Ponieważ dana strategia może nie obsługiwać wszystkich typów sprzężeń, w usłudze Databricks SQL nie ma gwarancji użycia strategii sprzężeń sugerowanej przez wskazówkę.

Składnia

join_hint
  BROADCAST ( table_name ) |
  MERGE ( table_name ) |
  SHUFFLE_HASH ( table_name ) |
  SHUFFLE_REPLICATE_NL ( table_name )

BROADCASTJOINi MAPJOIN są obsługiwane jako aliasy dla .BROADCAST

SHUFFLE_MERGEi MERGEJOIN są obsługiwane jako aliasy dla .MERGE

Typy wskazówek sprzężenia

  • BROADCAST ( table_name )

    Użyj łączenia typu broadcast. Strona sprzężenia ze wskazówką jest transmitowana niezależnie od autoBroadcastJoinThreshold. Jeśli obie strony sprzężenia mają wskazówki emisji, jest emitowany ten o mniejszym rozmiarze (na podstawie statystyk).

  • MERGE ( table_name )

    Użyj sprzężenia scalania sortowania shuffle.

  • SHUFFLE_HASH ( table_name )

    Użyj sprzężenia skrótu shuffle. Jeśli obie strony mają wskazówki dotyczące skrótu mieszania, Databricks SQL wybiera mniejszą stronę (na podstawie statystyk) jako stronę konstrukcyjną.

  • SHUFFLE_REPLICATE_NL ( table_name )

    Użyj sprzężenia zagnieżdżonej pętli typu shuffle-and-replicate.

  • table_name

    Uwidoczniona nazwa tabeli lub aliasu tabeli, do którego stosuje się podpowiedź.

Przykłady

-- Join Hints for broadcast join
> SELECT /*+ BROADCAST(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
> SELECT /*+ BROADCASTJOIN (t1) */ * FROM t1 left JOIN t2 ON t1.key = t2.key;
> SELECT /*+ MAPJOIN(t2) */ * FROM t1 right JOIN t2 ON t1.key = t2.key;

-- Join Hints for shuffle sort merge join
> SELECT /*+ SHUFFLE_MERGE(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
> SELECT /*+ MERGEJOIN(t2) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
> SELECT /*+ MERGE(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

-- Join Hints for shuffle hash join
> SELECT /*+ SHUFFLE_HASH(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

-- Join Hints for shuffle-and-replicate nested loop join
> SELECT /*+ SHUFFLE_REPLICATE_NL(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

-- When different join strategy hints are specified on both sides of a join, Databricks SQL
-- prioritizes the BROADCAST hint over the MERGE hint over the SHUFFLE_HASH hint
-- over the SHUFFLE_REPLICATE_NL hint.
-- Databricks SQL will issue Warning in the following example
-- org.apache.spark.sql.catalyst.analysis.HintErrorLogger: Hint (strategy=merge)
-- is overridden by another hint and will not take effect.
> SELECT /*+ BROADCAST(t1), MERGE(t1, t2) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

-- When a table name is occluded by an alias you must use the alias name in the hint
> SELECT /*+ BROADCAST(t1), MERGE(s1, s2) */ * FROM t1 AS s1 INNER JOIN t2 AS s2 ON s1.key = s2.key;

Wskazówki niesymetryczne

(Delta Lake) Aby uzyskać informacje na temat wskazówki dotyczącej sprzężenia niesymetrycznego, zobacz Optymalizacja sprzężenia niesymetrycznego za pomocą wskazówekSKEW.