힌트
적용 대상: Databricks SQL Databricks Runtime
실행 계획을 생성하기 위한 구체적인 방법을 제안합니다.
구문
/*+ { partition_hint | join_hint | skew_hint } [, ...] */
분할 힌트
분할 힌트를 사용하면 Azure Databricks에서 따라야 하는 분할 전략을 제안할 수 있습니다.
COALESCE
, REPARTITION
및 REPARTITION_BY_RANGE
힌트가 지원되며 각각 coalesce
, repartition
및 repartitionByRange
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가 사용하도록 설정되지 않은 경우 이 힌트는 무시됩니다.-
다시 분할하거나 균형을 조정할 열 또는 별칭의 노출된 이름입니다.
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 )
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 )
순서 섞기 및 복제 중첩 루프 조인을 사용합니다.
-
힌트가 적용되는 테이블 또는 테이블 별칭의 노출된 이름입니다.
예제
-- 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
참조하세요.