Sugestões

Aplica-se a: Marque Sim Databricks SQL Marque Sim Databricks Runtime

Sugira 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. COALESCE, REPARTITION, e REPARTITION_BY_RANGE as dicas são suportadas e são equivalentes a coalesce, repartitione repartitionByRange APIs de conjunto de dados, respectivamente. Essas dicas oferecem uma maneira de ajustar o 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 dica de particionamento

  • COALESCE ( part_num )

    Reduza o número de partições para o número especificado de partições. Ele usa um número de partição como parâmetro.

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

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

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

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

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

    A REBALANCE dica pode ser usada para reequilibrar as partições de saída do resultado da consulta, de modo que cada partição seja de um tamanho razoável (não muito pequeno e não muito grande). Ele pode tomar nomes de colunas como parâmetros e tentar o seu melhor para particionar o resultado da consulta por essas colunas. Este é o melhor esforço: se houver distorções, o Spark dividirá as partições enviesadas, para fazer com que essas partições não sejam muito grandes. Esta dica é útil quando você precisa escrever o resultado dessa consulta em uma tabela, para evitar arquivos muito pequenos/grandes. Essa dica será ignorada se o AQE não estiver habilitado.

  • column_name

    O nome exposto de uma coluna ou alias para reparticionar ou reequilibrar por.

  • part_num

    Um literal de número integral. O número de partições para as quais reparticionar.

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>

Junte-se a dicas

As dicas de junção permitem que você sugira a estratégia de junção que o Databricks SQL deve usar. Quando diferentes dicas de estratégia de junção são especificadas em ambos os lados de uma associação, o Databricks SQL prioriza as dicas na seguinte ordem: BROADCAST over MERGE over SHUFFLE_HASH .SHUFFLE_REPLICATE_NL Quando ambos os lados são especificados com a dica BROADCAST ou a dica, o SHUFFLE_HASH Databricks SQL escolhe o lado da compilação com base no tipo de junção e nos tamanhos das relações. Como uma determinada estratégia pode não suportar todos os tipos de junção, não é garantido 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 )

BROADCASTJOIN e MAPJOIN são suportados como aliases para BROADCAST.

SHUFFLE_MERGE e MERGEJOIN são suportados como aliases para MERGE.

Tipos de dicas de ingresso

  • BROADCAST ( table_name )

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

  • MERGE ( table_name )

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

  • SHUFFLE_HASH ( table_name )

    Utilize a associação hash aleatório. Se ambos os lados tiverem as sugestões de hash aleatório, o SQL do Databricks escolherá o lado mais pequeno (com base nas estatísticas) como o lado da compilação.

  • SHUFFLE_REPLICATE_NL ( table_name )

    Use a junção de loop aninhado aleatório e replicado.

  • table_name

    O nome exposto de uma tabela ou 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 distorcidas

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