Sdílet prostřednictvím


Nápověda

Platí pro:označeno jako ano Databricks SQL označeno jako ano Databricks Runtime

Navrhněte konkrétní přístupy ke generování plánu provádění.

Syntaxe

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

Rady pro dělení

Tipy pro dělení umožňují navrhnout strategii dělení, kterou by měla Azure Databricks dodržovat. COALESCE, REPARTITION a REPARTITION_BY_RANGE nápovědy jsou podporovány a jsou ekvivalentní rozhraním coalesce, repartition a repartitionByRange API datové sady. Tyto rady vám poskytnou způsob, jak ladit výkon a řídit počet výstupních souborů. Pokud je zadáno více hintů pro rozdělení, do logického plánu se vloží více uzlů, ale optimalizátor vybere levý hint.

Syntaxe

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

Typy tipů pro dělení

  • COALESCE ( part_num )

    Snižte počet oddílů na zadaný počet oddílů. Přijímá číslo oddílu jako parametr.

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

    Rozložte na zadaný počet oddílů pomocí zadaných výrazů pro rozdělení. Jako parametry přebírá číslo oddílu, názvy sloupců nebo obojí.

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

    Rozdělte na zadaný počet oddílů pomocí zadaných výrazů pro dělení. Jako parametry přebírá názvy sloupců a volitelné číslo oddílu.

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

    Nápovědu k REBALANCE lze použít k opětovnému vyvážení výstupních oddílů výsledků dotazu, aby byl každý oddíl přiměřený (ne příliš malý a ne příliš velký). Jako parametry může mít názvy sloupců a snaží se co nejlépe rozdělit výsledek dotazu podle těchto sloupců. Je to snaha o co nejlepší řešení: Pokud dojde ke zkosení, Spark rozdělí zkosené partice, aby tyto partice nebyly příliš velké. Tento tip je užitečný, když potřebujete napsat výsledek tohoto dotazu do tabulky, abyste se vyhnuli příliš malým nebo velkým souborům. Tento tip se ignoruje, pokud není povolená funkce AQE.

  • column_name

    Zobrazený název sloupce nebo aliasu, podle kterého má být opětovně rozděleno nebo vyváženo.

  • part_num

    Celočíselný literál. Počet oddílů, na které se mají oddíly předělovat.

Příklady

> 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>

Nápovědy pro připojení

Tipy pro spojení umožňují navrhnout strategii spojení, kterou by měl Databricks SQL používat. Pokud jsou na obou stranách spojení zadány různé rady strategie spojení, Databricks SQL upřednostňuje rady v následujícím pořadí: BROADCAST přes MERGE přes SHUFFLE_HASH přes SHUFFLE_REPLICATE_NL. Pokud jsou obě strany zadány pomocí BROADCAST nápovědy nebo SHUFFLE_HASH nápovědy, Databricks SQL vybere stranu pro sestavení na základě typu spojení a velikosti relací. Vzhledem k tomu, že daná strategie nemusí podporovat všechny typy spojení, není zaručeno, že Databricks SQL použije strategii spojení navrženou tipem.

Syntaxe

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

BROADCASTJOIN a MAPJOIN jsou podporovány jako aliasy pro BROADCAST.

SHUFFLE_MERGE a MERGEJOIN jsou podporovány jako aliasy pro MERGE.

Typy nápověd ke spojení

  • BROADCAST ( table_name )

    Použijte broadcast join. Strana ve spojení s nápovědou je vysílána bez ohledu na autoBroadcastJoinThreshold. Pokud obě strany spojení mají vysílací pokyny, je vysílána ta s menší velikostí (na základě statistik).

  • MERGE ( table_name )

    Použijte slučovací spojení typu shuffle sort merge.

  • SHUFFLE_HASH ( table_name )

    Použijte shuffle hash spojení. Pokud obě strany mají hinty pro hashování s náhodným zamícháním, zvolí Databricks SQL menší stranu (určenou na základě statistik) jako stranu konstrukce.

  • SHUFFLE_REPLICATE_NL ( table_name )

    Použijte spojení s prohazovací a replikační vnořenou smyčkou.

  • table_name

    Zobrazený název tabulky nebo aliasu tabulky, na který se vztahuje rada.

Příklady

-- 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;

Návrhy pro vychýlení

(Delta Lake) Informace o hintu najdete v části SKEW.