Delen via


Hints

Van toepassing op: vinkje als ja aan Databricks SQL vinkje als ja aan Databricks Runtime

Stel specifieke benaderingen voor het genereren van een uitvoeringsplan voor.

Syntaxis

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

Hints voor partitioneren

Met partitioneringshints kunt u een partitioneringsstrategie voorstellen die Azure Databricks moet volgen. COALESCE, REPARTITIONen REPARTITION_BY_RANGE hints worden ondersteund en zijn respectievelijk gelijk aan coalesce, repartitionen repartitionByRange gegevensset-API's. Deze hints geven u een manier om de prestaties af te stemmen en het aantal uitvoerbestanden te beheren. Wanneer er meerdere partitioneringshints worden opgegeven, worden meerdere knooppunten ingevoegd in het logische plan, maar wordt de meest linkse hint gekozen door de optimizer.

Syntaxis

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

Hinttypen partitioneren

  • COALESCE ( part_num )

    Verminder het aantal partities tot het opgegeven aantal partities. Er wordt een partitienummer als parameter gebruikt.

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

    Opnieuw partitioneren naar het opgegeven aantal partities met behulp van de opgegeven partitioneringsexpressies. Er wordt een partitienummer, kolomnamen of beide als parameters gebruikt.

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

    Opnieuw partitioneren naar het opgegeven aantal partities met behulp van de opgegeven partitioneringsexpressies. Hierbij worden kolomnamen en een optioneel partitienummer als parameters gebruikt.

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

    De REBALANCE hint kan worden gebruikt om de uitvoerpartities van het queryresultaat opnieuw te verdelen, zodat elke partitie een redelijke grootte heeft (niet te klein en niet te groot). Het kan kolomnamen als parameters gebruiken en het beste proberen om het queryresultaat te partitioneren door deze kolommen. Dit is een best-effort: als er scheeftrekken zijn, splitst Spark de scheve partities op om deze partities niet te groot te maken. Deze hint is handig wanneer u het resultaat van deze query naar een tabel moet schrijven om te voorkomen dat er te weinig/grote bestanden zijn. Deze hint wordt genegeerd als AQE niet is ingeschakeld.

  • column_name

    De weergegeven naam van een kolom of alias om opnieuw te partitioneren of opnieuw te verdelen.

  • part_num

    Een letterlijke waarde van een integraal getal. Het aantal partities waarnaar moet worden gepartitioneert.

Voorbeelden

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

Hints voor deelname

Met joinhints kunt u de joinstrategie voorstellen die Databricks SQL moet gebruiken. Wanneer verschillende hints voor joinstrategie aan beide zijden van een join worden opgegeven, geeft Databricks SQL prioriteit aan hints in de volgende volgorde: BROADCAST over over SHUFFLE_HASH MERGE SHUFFLE_REPLICATE_NL. Wanneer beide zijden worden opgegeven met de BROADCAST hint of de SHUFFLE_HASH hint, kiest Databricks SQL de build-zijde op basis van het jointype en de grootte van de relaties. Omdat een bepaalde strategie mogelijk niet alle jointypen ondersteunt, kan Databricks SQL niet gegarandeerd de joinstrategie gebruiken die wordt voorgesteld door de hint.

Syntaxis

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

BROADCASTJOIN en MAPJOIN worden ondersteund als aliassen voor BROADCAST.

SHUFFLE_MERGE en MERGEJOIN worden ondersteund als aliassen voor MERGE.

Hinttypen voor joins

  • BROADCAST ( table_name )

    Gebruik broadcast join. De join-zijde met de hint wordt uitgezonden, ongeacht autoBroadcastJoinThreshold. Als beide zijden van de join de broadcast-hints hebben, wordt de kant met de kleinere grootte (op basis van statistieken) uitgezonden.

  • MERGE ( table_name )

    Gebruik samenvoegen in willekeurige volgorde.

  • SHUFFLE_HASH ( table_name )

    Gebruik willekeurige hash-join. Als beide zijden de hash-hints voor willekeurige volgorde hebben, kiest Databricks SQL de kleinere kant (op basis van statistieken) als build-zijde.

  • SHUFFLE_REPLICATE_NL ( table_name )

    Geneste lusdeelname gebruiken en repliceren.

  • table_name

    De weergegeven naam van een tabel of tabelalias waarop de hint van toepassing is.

Voorbeelden

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

Scheefheidshints

(Delta Lake) Zie Optimalisatie van scheefheidsdeelname met behulp van scheve hints voor informatie over de SKEW hint.