Sugestões

As dicas dão-lhe uma forma de sugerir como o Spark SQL usa abordagens específicas para gerar o seu plano de execução.

Syntax

/*+ hint [ , ... ] */

Dicas de partição

As dicas de partição permitem-lhe sugerir uma estratégia de partição que o Spark deve seguir. COALESCE, REPARTITION e as dicas são REPARTITION_BY_RANGE suportadas e são equivalentes coalesce repartition a, e repartitionByRange APIs dataset, respectivamente. Estas dicas dão-lhe uma forma de sintonizar o desempenho e controlar o número de ficheiros de saída em Spark SQL. Quando são especificadas múltiplas dicas de partição, vários nós são inseridos no plano lógico, mas a sugestão mais à esquerda é escolhida pelo optimizador.

Tipos de sugestões de partição

  • COALESCE

    A COALESCE sugestão pode ser usada para reduzir o número de divisórias para o número especificado de divisórias. É preciso um número de partição como parâmetro.

  • REPARTIÇÃO

    A REPARTITION sugestão pode ser utilizada para repartir o número especificado de divisórias utilizando as expressões de partição especificadas. É preciso um número de partição, nomes de colunas, ou ambos como parâmetros.

  • REPARTITION_BY_RANGE

    A REPARTITION_BY_RANGE sugestão pode ser utilizada para repartir o número especificado de divisórias utilizando as expressões de partição especificadas. Tem nomes de colunas e um número de partição opcional como parâmetros.

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;

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

Junte pistas que lhe permitam sugerir a estratégia de união que Spark deve usar. Antes da Faísca 3.0, apenas a BROADCAST Dica de Junção foi apoiada. MERGE, SHUFFLE_HASH e o apoio da Joint SHUFFLE_REPLICATE_NL Hints foi adicionado em 3.0. Quando diferentes dicas de estratégia de junção são especificadas em ambos os lados de uma união, Spark prioriza sugestões na seguinte ordem: BROADCAST MERGE mais de SHUFFLE_HASH SHUFFLE_REPLICATE_NL . Quando ambos os lados são especificados com a BROADCAST sugestão ou a SHUFFLE_HASH sugestão, Spark escolherá o lado da construção com base no tipo de junção e nos tamanhos das relações. Uma vez que uma determinada estratégia pode não apoiar todos os tipos de junção, a Spark não está garantida a usar a estratégia de junção sugerida pela sugestão.

Junte-se a tipos de sugestões

  • TRANSMISSÃO

    Sugere que spark use broadcast join. O lado da união com a dica é transmitido independentemente de autoBroadcastJoinThreshold . Se ambos os lados da junta tiverem as dicas de transmissão, o que tem um tamanho menor (baseado em estatísticas) é transmitido. Os pseudónimos BROADCAST são BROADCASTJOIN MAPJOIN e.

  • FUSÃO

    Sugere que a Spark use shuffle tipo merge join. Os pseudónimos MERGE são SHUFFLE_MERGE MERGEJOIN e.

  • SHUFFLE_HASH

    Sugere que spark use shuffle hash join. Se ambos os lados tiverem as sugestões de haxixe baralhado, Spark escolhe o lado menor (baseado em estatísticas) como o lado da construção.

  • SHUFFLE_REPLICATE_NL

    Sugere que o Spark use a junta de laço aninhado de shuffle-and-replicate.

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, Spark
-- prioritizes the BROADCAST hint over the MERGE hint over the SHUFFLE_HASH hint
-- over the SHUFFLE_REPLICATE_NL hint.
-- Spark 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;

Sugestões de skew

(Delta Lake on Azure Databricks) Consulte a otimização do Skew Join para obter informações sobre a SKEW sugestão.