ヒント
説明
ヒントは、Spark SQL が実行計画を生成する特定の方法を提案する方法をユーザーに提供します。
構文
/*+ hint [ , ... ] */
パーティショニングヒント
パーティショニングヒントを使用すると、Spark が従うべきパーティショニング戦略を提案できます。COALESCE
、REPARTITION
、およびREPARTITION_BY_RANGE
ヒントがサポートされており、それぞれcoalesce
、repartition
、およびrepartitionByRange
Dataset APIに相当します。REBALANCE
はヒントとしてのみ使用できます。これらのヒントは、ユーザーがパフォーマンスを調整し、Spark SQL の出力ファイルの数を制御する方法を提供します。複数のパーティショニングヒントが指定されている場合、複数のノードが論理プランに挿入されますが、オプティマイザーによって最も左側のヒントが選択されます。
パーティショニングヒントの種類
-
COALESCE
COALESCE
ヒントは、パーティションの数を指定されたパーティション数に減らすために使用できます。パラメーターとしてパーティション番号を取ります。 -
REPARTITION
REPARTITION
ヒントは、指定されたパーティショニング式を使用して、指定されたパーティション数に再パーティショニングするために使用できます。パラメーターとして、パーティション番号、列名、またはその両方を取ります。 -
REPARTITION_BY_RANGE
REPARTITION_BY_RANGE
ヒントは、指定されたパーティショニング式を使用して、指定されたパーティション数に再パーティショニングするために使用できます。パラメーターとして、列名とオプションのパーティション番号を取ります。 -
REBALANCE
REBALANCE
ヒントは、クエリ結果の出力パーティションをリバランスするために使用できます。これにより、すべてのパーティションが妥当なサイズ(小さすぎず、大きすぎない)になります。パラメーターとして列名を取り、これらの列でクエリ結果をパーティション分割するように最善を尽くします。これはベストエフォートです。スキューがある場合、Spark はスキューしたパーティションを分割して、これらのパーティションが大きくなりすぎないようにします。このヒントは、テーブルへのこのクエリの結果を書き込む必要がある場合に、小さすぎる/大きすぎるファイルを回避するのに役立ちます。このヒントは、AQE が有効になっていない場合は無視されます。
例
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(3) */ * FROM t;
SELECT /*+ REBALANCE(c) */ * FROM t;
SELECT /*+ REBALANCE(3, c) */ * FROM t;
-- 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>
結合ヒント
結合ヒントを使用すると、Spark が使用する結合戦略を提案できます。Spark 3.0 より前は、BROADCAST
結合ヒントのみがサポートされていました。MERGE
、SHUFFLE_HASH
、およびSHUFFLE_REPLICATE_NL
結合ヒントのサポートは3.0で追加されました。結合の両側に異なる結合戦略ヒントが指定されている場合、Spark は次の順序でヒントを優先します。BROADCAST
がMERGE
よりも優先され、MERGE
がSHUFFLE_HASH
よりも優先され、SHUFFLE_HASH
がSHUFFLE_REPLICATE_NL
よりも優先されます。両側がBROADCAST
ヒントまたはSHUFFLE_HASH
ヒントで指定されている場合、Spark は結合の種類とリレーションのサイズに基づいてビルド側を選択します。特定の戦略がすべての結合タイプをサポートしているとは限らないため、Spark がヒントで提案された結合戦略を使用することが保証されているわけではありません。
結合ヒントの種類
-
BROADCAST
Spark がブロードキャスト結合を使用することを提案します。ヒントのある結合側は、
autoBroadcastJoinThreshold
に関係なくブロードキャストされます。結合の両側にブロードキャストヒントがある場合、サイズ(統計に基づく)が小さい方がブロードキャストされます。BROADCAST
のエイリアスは、BROADCASTJOIN
とMAPJOIN
です。 -
MERGE
Spark がシャッフルソートマージ結合を使用することを提案します。
MERGE
のエイリアスは、SHUFFLE_MERGE
とMERGEJOIN
です。 -
SHUFFLE_HASH
Spark がシャッフルハッシュ結合を使用することを提案します。両側にシャッフルハッシュヒントがある場合、Spark は小さい側(統計に基づく)をビルド側として選択します。
-
SHUFFLE_REPLICATE_NL
Spark がシャッフルアンドレプリケートネストループ結合を使用することを提案します。
例
-- 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, Spark
-- prioritizes the BROADCAST hint over the MERGE hint over the SHUFFLE_HASH hint
-- over the SHUFFLE_REPLICATE_NL hint.
-- Spark 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;