Dicas

Aplica-se a: marca de seleção positiva SQL do Databricks marca de seleção positiva Runtime do Databricks

Sugerir abordagens específicas para gerar um plano de execução.

Sintaxe

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

Dicas de particionamento

As dicas de particionamento permitem sugerir uma estratégia de particionamento que o Azure Databricks deve seguir. As dicas COALESCE, REPARTITION e REPARTITION_BY_RANGE têm suporte e são equivalentes às APIs do Conjunto de Dados coalesce, repartition e repartitionByRange, respectivamente. Essas dicas oferecem uma forma de ajustar desempenho e controlar o número de arquivos de saída. Quando várias dicas de particionamento são especificadas, vários nós são inseridos no plano lógico, mas a dica mais à esquerda é escolhida pelo otimizador.

Sintaxe

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

Tipos de dicas de particionamento

  • COALESCE ( part_num )

    Reduzir o número de partições para o número especificado. Aceita um número de partição como um parâmetro.

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

    Reparticionar para o número especificado de partições usando as expressões de particionamento especificadas. Aceita um número de partição, nomes de coluna ou ambos como parâmetros.

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

    Reparticionar para o número especificado de partições usando as expressões de particionamento especificadas. Aceita nomes de coluna e um número de partição opcional como parâmetros.

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

    A dica REBALANCE pode ser usada para rebalancear as partições de saída do resultado da consulta, de modo que cada partição tenha um tamanho razoável (nem muito pequeno nem muito grande). Pode usar nomes de coluna como parâmetros e tentar ao máximo particionar o resultado da consulta com base nessas colunas. Essa é uma dica de melhor esforço: se houver distorções, o Spark dividirá as partições distorcidas para que seu tamanho não seja excessivo. Essa dica é útil se você precisar gravar o resultado dessa consulta em uma tabela, para evitar arquivos muito pequenos/grandes. Ela será ignorada se o AQE não estiver habilitado.

  • column_name

    O nome exposto de uma coluna ou de um alias pelo qual será feita a repartição ou o rebalanceamento.

  • part_num

    Um literal de número integral. O número de partições para repartição.

Exemplos

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

Dicas de junção

Dicas de junção permitem sugerir a estratégia de junção que o SQL do Databricks deve usar. Quando diferentes dicas de estratégia de junção são especificadas em ambos os lados de uma junção, o SQL do Databricks as prioriza nesta ordem: BROADCAST sobre MERGE sobre SHUFFLE_HASH sobre SHUFFLE_REPLICATE_NL. Quando os dois lados são especificados com a dica BROADCAST ou SHUFFLE_HASH, o SQL do Databricks escolhe o lado do build com base no tipo de junção e nos tamanhos das relações. Como uma estratégia especificada talvez não dê suporte a todos os tipos de junção, não há garantias de que o Databricks SQL use a estratégia de junção sugerida pela dica.

Sintaxe

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

Há suporte para BROADCASTJOIN e MAPJOIN como aliases de BROADCAST.

Há suporte para SHUFFLE_MERGE e MERGEJOIN como aliases de MERGE.

Tipos de dica de junção

  • BROADCAST ( table_name )

    Use a junção de transmissão. O lado da junção com a dica é transmitido independentemente de autoBroadcastJoinThreshold. Se os dois lados da junção tiverem as dicas de difusão, será transmitido aquele que tiver menor tamanho (com base em estatísticas).

  • MERGE ( table_name )

    Use a junção de mesclagem de classificação aleatória.

  • SHUFFLE_HASH ( table_name )

    Use a junção de hash de ordem aleatória. Se os lados tiverem as dicas de hash de ordem aleatória, o SQL do Databricks escolherá o lado menor (com base em estatísticas) como o lado do build.

  • SHUFFLE_REPLICATE_NL ( table_name )

    Use a junção de loop aninhado shuffle-and-replicate.

  • table_name

    O nome exposto de uma tabela ou de um alias de tabela ao qual a dica se aplica.

Exemplos

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

Dicas de distorção

(Delta Lake) Confira Otimização de junção de distorção usando dicas de distorção para obter informações sobre a dica SKEW.