Dela via


Tips

Gäller för:markerad ja Databricks SQL markerad ja Databricks Runtime

Föreslå specifika metoder för att generate 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 partition tal som en parameter.

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

    Partitionering till det angivna antalet partitioner med de angivna partitioneringsuttrycken. Det tar ett partition nummer, column namn eller båda som parameters.

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

    Partitionering till det angivna antalet partitioner med de angivna partitioneringsuttrycken. Det tar column namn och ett valfritt partition nummer som parameters.

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

    Det REBALANCE tipset 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 column namn som parametersoch göra sitt bästa för att partition frågeresultatet med dessa columns. 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 table, 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å ett column eller alias för att ompartitionera eller ombalansera med.

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

Join ledtrådar

Join tips kan du föreslå den join strategi som Databricks SQL bör använda. När olika join strategitips anges på båda sidor av en joinprioriterar Databricks SQL tips i följande ordning: BROADCAST över MERGE över SHUFFLE_HASH över SHUFFLE_REPLICATE_NL. När båda sidor anges med BROADCAST tips eller SHUFFLE_HASH tips, väljer Databricks SQL byggsidan baserat på join typ och storleken på relationerna. Eftersom en viss strategi kanske inte stöder alla join typer är Databricks SQL inte garanterat att använda den join strategi 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.

Join tipstyper

  • BROADCAST ( table_name )

    Använd broadcast-join. Sidan join med ledtråden sänds oavsett vad autoBroadcastJoinThresholdär. Om båda sidorna av join har sändningsindikatorer, sänds den med den mindre storleken (baserat på statistik).

  • MERGE ( table_name )

    Använd shuffle sort merge join.

  • 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 loop join.

  • table_name

    Det exponerade namnet på en table eller table-alias 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 SKEW tips finns i Skev join optimering med hjälp av sneda tips.