[ヒント]

適用対象: 「はい」のチェック マーク Databricks SQL 「はい」のチェック マーク Databricks Runtime

実行プランを生成するための具体的な方法を提案します。

構文

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

パーティション分割のヒント

パーティション分割のヒントを使用すると、Azure Databricks で従う必要があるパーティション分割戦略を提案できます。 COALESCEREPARTITIONREPARTITION_BY_RANGE のヒントがサポートされ、それぞれ coalescerepartitionrepartitionByRange Dataset 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 によって、BROADCASTMERGESHUFFLE_HASHSHUFFLE_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 )

BROADCASTJOINMAPJOINBROADCAST のエイリアスとしてサポートされています。

SHUFFLE_MERGEMERGEJOINMERGE のエイリアスとしてサポートされています。

結合ヒントの種類

  • 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 ヒントについては、「スキュー ヒントを使用したスキュー結合の最適化」を参照してください。