Tips

Gäller för:check marked yes Databricks SQL check marked yes Databricks Runtime

Föreslå specifika metoder för att generera en körningsplan.

Syntax

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

Partitioneringstips

Med partitioneringstips kan du föreslå en partitioneringsstrategi som Azure Databricks bör följa. COALESCE, REPARTITION, och REPARTITION_BY_RANGE tips stöds och motsvarar coalesce, repartitionoch repartitionByRange Datauppsättnings-API:er. De här tipsen ger dig ett sätt att justera prestanda och kontrollera antalet utdatafiler. När flera partitioneringstips anges infogas flera noder i den logiska planen, men tipset längst till vänster väljs av optimeraren.

Syntax

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

Partitioneringstipstyper

  • COALESCE ( part_num )

    Minska antalet partitioner till det angivna antalet partitioner. Det tar ett partitionsnummer som en parameter.

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

    Partitionering till det angivna antalet partitioner med de angivna partitioneringsuttrycken. Det tar ett partitionsnummer, kolumnnamn eller båda som parametrar.

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

    Partitionering till det angivna antalet partitioner med de angivna partitioneringsuttrycken. Det tar kolumnnamn och ett valfritt partitionsnummer som parametrar.

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

    Tipset REBALANCE kan användas för att balansera om frågeresultatets utdatapartitioner, så att varje partition har en rimlig storlek (inte för liten och inte för stor). Det kan ta kolumnnamn som parametrar och göra sitt bästa för att partitionera frågeresultatet med dessa kolumner. Det här är ett bra försök: Om det finns skevhet delar Spark upp de skeva partitionerna så att partitionerna inte blir för stora. Det här tipset är användbart när du behöver skriva resultatet av den här frågan till en tabell för att undvika för små/stora filer. Det här tipset ignoreras om AQE inte är aktiverat.

  • column_name

    Det exponerade namnet på en kolumn eller ett alias för ompartition eller ombalansering av.

  • part_num

    En integraltalliteral. Antalet partitioner att partitionera om till.

Exempel

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

Kopplingstips

Med join-tips kan du föreslå den kopplingsstrategi som Databricks SQL ska använda. När olika kopplingsstrategitips anges på båda sidor av en koppling prioriterar Databricks SQL tips i följande ordning: BROADCAST över MERGE över SHUFFLE_HASHSHUFFLE_REPLICATE_NL. När båda sidor anges med tipset BROADCAST eller tipset SHUFFLE_HASH väljer Databricks SQL byggsidan baserat på kopplingstypen och storleken på relationerna. Eftersom en viss strategi kanske inte stöder alla kopplingstyper är Databricks SQL inte garanterat att använda den kopplingsstrategi som föreslås i tipset.

Syntax

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

BROADCASTJOIN och MAPJOIN stöds som alias för BROADCAST.

SHUFFLE_MERGE och MERGEJOIN stöds som alias för MERGE.

Kopplingstipstyper

  • BROADCAST ( table_name )

    Använd sändningskoppling. Kopplingssidan med tipset sänds oavsett autoBroadcastJoinThreshold. Om båda sidor av kopplingen har sändningstipsen sänds den med den mindre storleken (baserat på statistik).

  • MERGE ( table_name )

    Använd blanda sammanfogningskoppling.

  • SHUFFLE_HASH ( table_name )

    Använd shuffle hash join. Om båda sidor har shuffle-hashtipsen väljer Databricks SQL den mindre sidan (baserat på statistik) som byggsida.

  • SHUFFLE_REPLICATE_NL ( table_name )

    Använd shuffle-and-replicate kapslad loopkoppling.

  • Table_name

    Det exponerade namnet på en tabell eller ett tabellalias som tipset gäller för.

Exempel

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

Skeva tips

(Delta Lake) Mer information om tips finns i Optimering av skev koppling med hjälp av SKEW snedställningstips.