Sdílet prostřednictvím


Tipy

Platí pro:zaškrtnutí označeného ano Databricks SQL zaškrtnutí označeného 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, REPARTITIONa REPARTITION_BY_RANGE nápovědy jsou podporovány a jsou ekvivalentní coalescerozhraním repartitionAPI a repartitionByRange rozhraním 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 tipů pro dělení, do logického plánu se vloží více uzlů, ale optimalizátor vybere úplně vlevo.

Syntaxe

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

Typy tipů pro dělení

  • COALESCE ( part_num )

    Snižte počet oddílů na zadaný počet oddílů. Jako parametr přebírá číslo oddílu.

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

    Předělte oddíly na zadaný počet oddílů pomocí zadaných výrazů dělení. Jako parametry přebírá číslo oddílu, názvy sloupců nebo obojí.

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

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

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

    Nápovědu REBALANCE můžete použít k obnovení rovnováhy výstupních oddílů výsledků dotazu, aby každý oddíl byl rozumně velký (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ů. Toto je nejlepší úsilí: Pokud dojde ke nerovnoměrné distribuci, Spark rozdělí zkosené oddíly, aby tyto oddíly 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

    Vystavený název sloupce nebo aliasu pro opětovné rozdělení nebo vyrovnání podle.

  • part_num

    Celočíselný čí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 spojení

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 ke strategii spojení, Databricks SQL upřednostňuje rady v následujícím pořadí: BROADCAST over MERGE over over SHUFFLE_HASHSHUFFLE_REPLICATE_NL. Pokud jsou obě strany zadány pomocí BROADCAST nápovědy nebo SHUFFLE_HASH nápovědy, Databricks SQL vybere stranu 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 tipů spojení

  • BROADCAST ( table_name )

    Použijte připojení k vysílání. Spojení strany s nápovědou je všesměrové bez ohledu na autoBroadcastJoinThreshold. Pokud obě strany spojení mají rady vysílání, ten s menší velikostí (na základě statistik) je všesměrový.

  • MERGE ( table_name )

    Použijte slučovací spojení se shuffle.

  • SHUFFLE_HASH ( table_name )

    Použijte spojení hash shuffle. Pokud obě strany mají nápovědu k hodnotě hash náhodného prohazování, zvolí sql Databricks menší stranu (na základě statistik) jako stranu sestavení.

  • SHUFFLE_REPLICATE_NL ( table_name )

    Použijte spojení s vnořenou smyčkou náhodného prohazování a replikaci.

  • Table_name

    Vystavený název tabulky nebo aliasu tabulky, na který se nápověda vztahuje.

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;

Tipy pro nerovnoměrnou distribuci

(Delta Lake) Informace o nápovědě SKEW najdete v tématu Optimalizace nerovnoměrné distribuce spojení pomocí nápovědy.