Sugestões
Aplica-se a: Databricks SQL Databricks Runtime
Sugira abordagens específicas para ajustar um plano de execução para generate.
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
, repartition
e 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 partition 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. É preciso um número partition, nomes column ou ambos, como parameters.
REPARTITION_BY_RANGE ( column_name [, ...] [, part_num]
Reparticione para o número especificado de partições usando as expressões de particionamento especificadas. São necessários column nomes e um número opcional de partition como parameters.
REBALANCE [ ( column_name [, ...] ) ]
A dica
REBALANCE
pode ser usada para reequilibrar as partições de saída do resultado da consulta, para que cada partition seja de um tamanho razoável (não muito pequeno e nem muito grande). Ele pode tomar column nomes como parameterse fazer o máximo para partition o resultado da consulta com esses columns. 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 desta consulta para um table, para evitar arquivos muito pequenos / grandes. Essa dica será ignorada se o AQE não estiver habilitado.-
O nome exposto de um column ou pseudônimo usado para reparticionar ou reequilibrar.
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>
Join dicas
As dicas Join permitem-lhe sugerir a estratégia join que o Databricks SQL deve usar.
Quando diferentes dicas de estratégia de join são especificadas em ambos os lados de um join, o Databricks SQL prioriza as dicas na seguinte ordem: BROADCAST
sobre MERGE
sobre SHUFFLE_HASH
sobre SHUFFLE_REPLICATE_NL
.
Quando ambos os lados são especificados com a dica BROADCAST
ou a dica SHUFFLE_HASH
, o Databricks SQL seleciona o lado a compilar com base no tipo de join e nos tamanhos das relações.
Como uma determinada estratégia pode não suportar todos os tipos de join, não é garantido que o Databricks SQL use a estratégia join 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
.
Join tipos de sugestões
BROADCAST ( table_name )
Use a transmissão join. O lado join com a dica é transmitido independentemente de
autoBroadcastJoinThreshold
. Se ambos os lados do join tiverem os indícios de transmissão, aquele com o tamanho menor (com base nas estatísticas) será transmitido.MERGE ( table_name )
Use a mesclagem de classificação aleatória join.
SHUFFLE_HASH ( table_name )
Use o shuffle hash join. 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 o loop aninhado aleatório e replicado join.
-
O nome exposto de um table ou table-alias ao qual a indicação 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
(Delta Lake) Consulte a otimização de enviesamento join usando sugestões de enviesamento para obter informações sobre a sugestão SKEW
.