Подсказки
Область применения: Databricks SQL Databricks Runtime
Предложить конкретные подходы к созданию плана выполнения.
Синтаксис
/*+ { partition_hint | join_hint | skew_hint } [, ...] */
Указания для секционирования
Указания по секционированием позволяют предложить стратегию секционирования, которая должна соответствовать Azure Databricks.
Указания COALESCE
, REPARTITION
и REPARTITION_BY_RANGE
поддерживаются и эквивалентны программным интерфейсам coalesce
, repartition
и repartitionByRange
наборов данных соответственно.
Эти указания позволяют настроить производительность и контролировать количество выходных файлов.
Если дано несколько указаний для секционирования, в логический план добавляются несколько узлов, а оптимизатор начинает обработку с указания, которое расположено первым слева.
Синтаксис
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 )
Используйте алгоритм хеш-соединения с перетасовкой. Если по обе стороны соединения даны указания о соединении с перемешанным хэшем, то сторона сборки определяется по указанию с наименьшим размером (по данными статистики).
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
см. в оптимизации соединения с помощью подсказок с отклонением.