Delen via


Hints

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

Stel specifieke benaderingen voor om generate uit te voeren binnen een uitvoeringsplan.

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 partition getal als parameter gebruikt.

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

    Opnieuw partitioneren naar het opgegeven aantal partities met behulp van de opgegeven partitioneringsexpressies. Het neemt een partition getal, column namen of beide als parameters.

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

    Opnieuw partitioneren naar het opgegeven aantal partities met behulp van de opgegeven partitioneringsexpressies. Het vereist column namen en heeft een optioneel partition getal als parametersnodig.

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

    De REBALANCE hint kan worden gebruikt om de uitvoerpartities van het queryresultaat opnieuw te verdelen, zodat elke partition een redelijke grootte heeft (niet te klein en niet te groot). Het kan column namen als parametersnemen en zijn best doen om het queryresultaat door deze partitionte columns. 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 tablemoet schrijven om te voorkomen dat er te kleine/grote bestanden zijn. Deze hint wordt genegeerd als AQE niet is ingeschakeld.

  • column_name

    De weergegeven naam van een column of alias om te herpartitioneren of opnieuw te balanceren.

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

Join aanwijzingen

Met Join-aanwijzingen kunt u de join-strategie voorstellen die Databricks SQL zou moeten gebruiken. Wanneer verschillende join strategiehints aan beide zijden van een joinworden opgegeven, geeft Databricks SQL prioriteit aan hints in de volgende volgorde: BROADCAST over MERGE over SHUFFLE_HASH boven 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 join type en de grootte van de relaties. Omdat een bepaalde strategie mogelijk niet alle join typen ondersteunt, is het niet gegarandeerd dat Databricks SQL de door de hint voorgestelde join-strategie gebruikt.

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.

Join hinttypen

  • BROADCAST ( table_name )

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

  • MERGE ( table_name )

    Gebruik joinvoor shuffle, sorteren en samenvoegen.

  • SHUFFLE_HASH ( table_name )

    Gebruik shuffle-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 )

    Gebruik willekeurige en gerepliceerde lus join.

  • table_name

    De weergegeven naam van een table of table-alias 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 Skew join-optimalisatie met behulp van skew hints voor informatie over de SKEW hint.