提示

适用于:check marked yes Databricks SQL check marked yes Databricks Runtime

建议生成执行计划的特定方法。

语法

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

分区提示

可以使用分区提示来建议 Azure Databricks 应遵循的分区策略。 支持 COALESCEREPARTITIONREPARTITION_BY_RANGE 提示,它们分别等效于数据集 API coalescerepartitionrepartitionByRange。 通过这些提示,你可优化性能并控制输出文件的数量。 如果指定了多个分区提示,则会在逻辑计划中插入多个节点,但优化器会选取最左侧的提示。

语法

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

分区提示类型

  • COALESCE ( part_num )

    将分区数减少到指定的分区数。 它采用分区数作为参数。

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

    使用指定的分区表达式将分区数调整为指定数量。 它采用分区数和/或列名称作为参数。

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

    使用指定的分区表达式将分区数调整为指定数量。 它采用列名称和分区数作为参数,其中分区数是可选项。

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

    REBALANCE 提示可用于重新平衡查询结果输出分区,使每个分区的大小合理(不小也不大)。 它可以将列名作为参数,并尽量按这些列对查询结果进行分区。 这项工作属于尽力而为:如果存在倾斜,Spark 会拆分倾斜的分区,以使这些分区不会太大。 当需要将此查询的结果写入表时,此提示很有用,可避免文件过小/过大。 如果未启用 AQE,则忽略此提示。

  • column_name

    要作为重新分区或重新平衡依据的列或别名的公开名称。

  • part_num

    整数文本。 要重新分区到的分区数。

示例

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

联接提示

可以使用联接提示来建议 Databricks SQL 应使用的联接策略。 如果在联接的两端指定了不同的联接策略提示,Databricks SQL 将按以下顺序设置提示优先级:BROADCAST 高于 MERGE 高于 SHUFFLE_HASH 高于 SHUFFLE_REPLICATE_NL。 如果两端都指定有 BROADCAST 提示或 SHUFFLE_HASH 提示,Databricks SQL 会根据联接类型和关系大小选取生成端。 由于给定策略可能不支持全部联接类型,因此不保证 Databricks SQL 使用提示建议的联接策略。

语法

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

支持使用 BROADCASTJOINMAPJOIN 作为 BROADCAST 的别名。

支持使用 SHUFFLE_MERGEMERGEJOIN 作为 MERGE 的别名。

联接提示类型

  • BROADCAST ( table_name )

    使用广播联接。 无论 autoBroadcastJoinThreshold 如何,都将广播带有提示的联接端。 如果联接的两端都具有广播提示,则广播较小的一端(根据统计信息确定)。

  • MERGE ( table_name )

    使用随机排序合并联接。

  • SHUFFLE_HASH ( table_name )

    使用随机哈希联接。 如果两端都有随机哈希提示,Databricks SQL 会选择较小的一端作为生成端(根据统计信息确定)。

  • SHUFFLE_REPLICATE_NL ( table_name )

    使用随机复制嵌套循环联接。

  • table_name

    应用提示的表或表别名的公开名称。

示例

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

倾斜提示

(Delta Lake) 有关 SKEW 提示的信息,请参阅使用偏差提示的偏差联接优化