Tipy
Platí pro: Databricks SQL
Databricks Runtime
Navrhněte konkrétní přístupy ke generování plánu provádění.
Syntaxe
/*+ { partition_hint | join_hint | skew_hint } [, ...] */
Rady pro dělení
Tipy pro dělení umožňují navrhnout strategii dělení, kterou by měla Azure Databricks dodržovat.
COALESCE
, REPARTITION
a REPARTITION_BY_RANGE
nápovědy jsou podporovány a jsou ekvivalentní coalesce
rozhraním repartition
API a repartitionByRange
rozhraním API datové sady.
Tyto rady vám poskytnou způsob, jak ladit výkon a řídit počet výstupních souborů.
Pokud je zadáno více tipů pro dělení, do logického plánu se vloží více uzlů, ale optimalizátor vybere úplně vlevo.
Syntaxe
partition_hint
COALESCE ( part_num ) |
REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } ) |
REPARTITION_BY_RANGE ( column_name [, ...] [, part_num] ) |
REBALANCE [ ( column_name [, ...] ) ]
Typy tipů pro dělení
COALESCE ( part_num )
Snižte počet oddílů na zadaný počet oddílů. Přijímá číslo oddílu jako parametr.
REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } )
Předělte oddíly na zadaný počet oddílů pomocí zadaných výrazů dělení. Jako parametry přebírá číslo oddílu, názvy sloupců nebo obojí.
REPARTITION_BY_RANGE ( column_name [, ...] [, part_num]
Předělte oddíly na zadaný počet oddílů pomocí zadaných výrazů dělení. Jako parametry přebírá názvy sloupců a volitelné číslo oddílu.
REBALANCE [ ( column_name [, ...] ) ]
Nápovědu k
REBALANCE
lze použít k opětovnému vyvážení výstupních oddílů výsledků dotazu, aby byl každý oddíl přiměřený (ne příliš malý a ne příliš velký). Jako parametry může mít názvy sloupců a snaží se co nejlépe rozdělit výsledek dotazu podle těchto sloupců. Toto je nejlepší úsilí: Pokud dojde ke nerovnoměrné distribuci, Spark rozdělí zkosené oddíly, aby tyto oddíly nebyly příliš velké. Tento tip je užitečný, když potřebujete napsat výsledek tohoto dotazu do tabulky, abyste se vyhnuli příliš malým nebo velkým souborům. Tento tip se ignoruje, pokud není povolená funkce AQE.-
Zobrazený název sloupce nebo aliasu, podle kterého má být opětovně rozděleno nebo vyváženo.
part_num
Celočíselný číselný literál. Počet oddílů, na které se mají oddíly předělovat.
Příklady
> 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>
Nápovědy pro připojení
Tipy pro spojení umožňují navrhnout strategii spojení, kterou by měl Databricks SQL používat.
Pokud jsou na obou stranách spojení zadány různé rady strategie spojení, Databricks SQL upřednostňuje rady v následujícím pořadí: BROADCAST
přes MERGE
přes SHUFFLE_HASH
přes SHUFFLE_REPLICATE_NL
.
Pokud jsou obě strany zadány pomocí BROADCAST
nápovědy nebo SHUFFLE_HASH
nápovědy, Databricks SQL vybere stranu pro sestavení na základě typu spojení a velikosti relací.
Vzhledem k tomu, že daná strategie nemusí podporovat všechny typy spojení, není zaručeno, že Databricks SQL použije strategii spojení navrženou tipem.
Syntaxe
join_hint
BROADCAST ( table_name ) |
MERGE ( table_name ) |
SHUFFLE_HASH ( table_name ) |
SHUFFLE_REPLICATE_NL ( table_name )
BROADCASTJOIN
a MAPJOIN
jsou podporovány jako aliasy pro BROADCAST
.
SHUFFLE_MERGE
a MERGEJOIN
jsou podporovány jako aliasy pro MERGE
.
Typy nápověd ke spojení
BROADCAST ( table_name )
Použijte broadcast join. Strana ve spojení s nápovědou je vysílána bez ohledu na
autoBroadcastJoinThreshold
. Pokud obě strany spojení mají vysílací pokyny, je vysílána ta s menší velikostí (na základě statistik).MERGE ( table_name )
Použijte slučovací spojení typu shuffle sort merge.
SHUFFLE_HASH ( table_name )
Použijte shuffle hash spojení. Pokud obě strany mají nápovědu k hodnotě hash náhodného prohazování, zvolí sql Databricks menší stranu (na základě statistik) jako stranu sestavení.
SHUFFLE_REPLICATE_NL ( table_name )
Použijte spojení s prohazovací a replikační vnořenou smyčkou.
-
Zobrazený název tabulky nebo aliasu tabulky, na který se vztahuje rada.
Příklady
-- 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;
Tipy pro nerovnoměrnou distribuci
(Delta Lake) Informace o hintu najdete v části SKEW
.