Hinweise

Gilt für:check marked yes Databricks SQL check marked yes Databricks Runtime

Vorschläge für bestimmte Ansätze zum Generieren eines Ausführungsplans.

Syntax

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

Partitionierungshinweise

Mit Partitionierungshinweisen können Sie eine Partitionierungsstrategie vorschlagen, der Azure Databricks folgen sollte. COALESCE-, REPARTITION- und REPARTITION_BY_RANGE-Hinweise werden unterstützt und entsprechen den Dataset-APIs coalesce, repartition bzw. repartitionByRange. Diese Hinweise bieten eine Möglichkeit, die Leistung zu optimieren und die Anzahl der Ausgabedateien zu steuern. Werden mehrere Partitionierungshinweise angegeben, werden mehrere Knoten in den logischen Plan eingefügt. Allerdings wird vom Optimierer nur der Hinweis verwendet, der sich ganz links befindet.

Syntax

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

Typen der Partitionierungshinweise

  • COALESCE ( part_num )

    Reduzierung der Anzahl von Partitionen auf die angegebene Partitionsanzahl. Dabei wird eine Partitionsanzahl als Parameter verwendet.

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

    Neupartitionierung für die angegebene Anzahl von Partitionen mithilfe der angegebenen Partitionierungsausdrücke. Dabei werden eine Partitionsanzahl, Spaltennamen oder beides als Parameter verwendet.

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

    Neupartitionierung für die angegebene Anzahl von Partitionen mithilfe der angegebenen Partitionierungsausdrücke. Dabei werden Spaltennamen und optional eine Partitionsanzahl als Parameter verwendet.

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

    Der REBALANCE-Hinweis kann verwendet werden, um die Ausgabepartitionen des Abfrageergebnisses neu zu verteilen, sodass jede Partition eine angemessene Größe hat (nicht zu klein und nicht zu groß). Er kann Spaltennamen als Parameter verwenden und versuchen, das Abfrageergebnis nach diesen Spalten zu partitionieren. Hierbei handelt es sich um ein Best-Effort-Verfahren: Wenn es Schiefen gibt, teilt Spark die schiefen Partitionen auf, um diese Partitionen nicht zu groß zu machen. Dieser Hinweis ist nützlich, wenn Sie das Ergebnis dieser Abfrage in eine Tabelle schreiben müssen, um zu kleine/große Dateien zu vermeiden. Dieser Hinweis wird ignoriert, wenn AQE nicht aktiviert ist.

  • column_name

    Der verfügbar gemachte Name einer Spalte oder eines Alias zum Neupartitionieren oder Neuausbalancieren nach.

  • part_num

    Ein integrales Zahlenliteral. Die Anzahl der Partitionen, in die neu partitioniert werden soll.

Beispiele

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

Mit Join-Hints können Sie die Join-Strategie vorschlagen, die Databricks SQL verwenden sollte. Wenn auf beiden Seiten eines Joins unterschiedliche Hints für die Join-Strategie angegeben werden, priorisiert Databricks SQL die Hints in der folgenden Reihenfolge: BROADCAST vor MERGE vor SHUFFLE_HASH vor SHUFFLE_REPLICATE_NL. Wenn mit dem BROADCAST- oder SHUFFLE_HASH-Hint beide Seiten angegeben werden, wählt Databricks SQL anhand des Join-Typs und den Beziehungsgrößen die Buildseite aus. Da eine bestimmte Strategie möglicherweise nicht alle Join-Typen unterstützt, ist nicht gewährleistet, dass Databricks SQL die vom Hint vorgeschlagene Join-Strategie verwendet.

Syntax

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

BROADCASTJOIN und MAPJOIN werden als Aliase für BROADCAST unterstützt.

SHUFFLE_MERGE und MERGEJOIN werden als Aliase für MERGE unterstützt.

Typen der Joinhinweise

  • BROADCAST ( table_name )

    Verwendung des Broadcast-Joins. Die Joinseite mit dem Hinweis wird unabhängig vom autoBroadcastJoinThreshold übertragen. Wenn beide Seiten des Joins über die Broadcast-Hinweise verfügen, wird die mit der kleineren Größe (basierend auf Statistiken) übertragen.

  • MERGE ( table_name )

    Verwenden von SHUFFLE_MERGE und MERGEJOIN.

  • SHUFFLE_HASH ( table_name )

    Verwenden von SHUFFLE_HASH-Join. Wenn beide Seiten über die SHUFFLE_HASH-Hints verfügen, wählt Databricks SQL die kleinere Seite (basierend auf Statistiken) als Buildseite aus.

  • SHUFFLE_REPLICATE_NL ( table_name )

    Verwendung von SHUFFLE_REPILCATE-Nested Loop-Join.

  • table_name

    Der verfügbar gemachte Name einer Tabelle oder eines Tabellenalias, auf die der Hinweis angewendet wird.

Beispiele

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

Hinweise bei Datenschiefen

(Delta Lake) Weitere Informationen zum SKEW-Hinweis finden Sie unter Datenschiefe: Optimierung der Verknüpfung mithilfe von Hinweisen.