提示

適用於:check marked yes Databricks SQL check marked yes Databricks Runtime

建議產生執行計劃的特定方法。

語法

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

數據分割提示

數據分割提示可讓您建議 Azure Databricks 應遵循的數據分割策略。 COALESCE支援、 REPARTITIONREPARTITION_BY_RANGE 提示,且分別相當於 coalescerepartitionrepartitionByRange 資料集 API。 這些提示可讓您微調效能並控制輸出檔案的數目。 指定多個數據分割提示時,會將多個節點插入邏輯計劃中,但優化器會挑選最左邊的提示。

語法

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 會依下列順序排列提示的優先順序: BROADCASTMERGE 超過 SHUFFLE_HASHSHUFFLE_REPLICATE_NL。 使用提示或SHUFFLE_HASH提示指定BROADCAST兩端時,Databricks SQL 會根據聯結類型和關聯的大小來挑選組建端。 因為指定的策略可能不支援所有聯結類型,因此不保證 Databricks SQL 會使用提示建議的聯結策略。

語法

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

BROADCASTJOIN 支援和 MAPJOIN 作為的 BROADCAST別名。

SHUFFLE_MERGE 支援和 MERGEJOIN 作為的 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;

扭曲提示

(達美湖)如需提示的相關信息,請參閱 使用扭曲提示SKEW 扭曲聯結優化。