Поделиться через


Подсказки

Область применения:проверка помечены да 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 не включены.

  • 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>

Указания для оператора join

Указания для оператора join позволяют подготовить стратегию соединения для Databricks SQL. Если по обе стороны оператора join находятся разные указания, приоритет для них устанавливается в следующем порядке: BROADCAST, MERGE, SHUFFLE_HASH, SHUFFLE_REPLICATE_NL. Если по обе стороны находятся указания BROADCAST или SHUFFLE_HASH, приоритет стороны сборки определяется на основании типа соединения и размеров связей. Так как данная стратегия может не поддерживать все типы соединений, 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.

Типы указаний для оператора join

  • BROADCAST ( table_name )

    Выполняется широковещательное соединение. Сторона соединения с указанием является широковещательной, независимо от autoBroadcastJoinThreshold. Если по обе стороны соединения даны указания о широковещательном соединении, то выполняется указание с наименьшим размером (определяется данными статистики).

  • MERGE ( table_name )

    Выполняется соединения типа "сортировка через слияние с перемешиванием".

  • SHUFFLE_HASH ( table_name )

    Выполняется соединение типа "перемешанный хэш". Если по обе стороны соединения даны указания о соединении с перемешанным хэшем, то сторона сборки определяется по указанию с наименьшим размером (по данными статистики).

  • 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 .