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


Оператор partition

Область применения: ✅Microsoft Fabric

Оператор секционирования секционирует записи входной таблицы в несколько вложенных таблиц в соответствии со значениями в ключевом столбце. Оператор запускает вложенный запрос для каждой подсети и создает одну выходную таблицу, которая является объединением результатов всех вложенных запросов.

Оператор секции полезен, если необходимо выполнить вложенный запрос только в подмножестве строк, принадлежащих одному ключу секции, а не запросу всего набора данных. Эти вложенные запросы могут включать агрегатные функции, функции окна, верхние N и другие.

Оператор секционирования поддерживает несколько стратегий операции вложенных запросов:

  • Native — используется с неявным источником данных с тысячами значений разделов ключей.
  • Перетасовка — использование с неявным источником с миллионами ключевых значений секций.
  • Устаревшая версия — используется с неявным или явным источником для 64 или меньше значений разделов ключей.

Синтаксис

T|partition [ стратегия ] [ hint.strategy=подсказки ] by()

T|partition [ [ hint.strategy=legacyподсказки ] by Столбец{SubQueryWithSource}

Дополнительные сведения о соглашениях синтаксиса.

Параметры

Имя (название) Type Обязательно Описание
T string ✔️ Входной табличный источник.
Стратегия string Значение legacy, shuffleили native. Это указание определяет стратегию выполнения оператора секционирования.

Если стратегия не указана legacy , используется стратегия. Дополнительные сведения см. в разделе "Стратегии".
Столбец string ✔️ Имя столбца в T , значения которого определяют, как секционировать входной табличный источник.
TransformationSubQuery string ✔️ Табличное выражение преобразования. Источник неявно представляет собой вложенные таблицы, созданные путем секционирования записей T. Каждая подкатабельная имеет однородное значение столбца.

Выражение должно предоставлять только один табличный результат и не должно иметь других типов операторов, таких как let операторы.
SubQueryWithSource string ✔️ Табличное выражение, включающее собственный табличный источник, например ссылку на таблицу. Этот синтаксис поддерживается только с устаревшей стратегией. Вложенный запрос может ссылаться только на ключевой столбец, столбец из T. Чтобы ссылаться на столбец, используйте синтаксис toscalar(столбца)

Выражение должно предоставлять только один табличный результат и не должно иметь других типов операторов, таких как let операторы.
Указания string Ноль или больше разделенных пробелами параметров в виде: HintName = Value, которые управляют поведением оператора. См. поддерживаемые подсказки для каждого типа стратегии.

Поддерживаемые подсказки

Имя подсказки Type Стратегия Описание
hint.shufflekey string shuffle Ключ секции, используемый для запуска оператора секции с shuffle помощью стратегии.
hint.materialized bool наследство Если задано значение true, материализует источник оператора partition. Значение по умолчанию — false.
hint.concurrency int наследство Определяет количество секций, выполняемых параллельно. Значение по умолчанию — 16.
hint.spread int наследство Определяет, как распределять секции между узлами кластера. Значение по умолчанию — 1.

Например, если есть секции N, а указание распространения равно P, то секции N обрабатываются P разными узлами кластера в зависимости от указания параллелизма.

Возвраты

Оператор возвращает объединение результатов отдельных вложенных запросов.

Стратегии

Оператор секционирования поддерживает несколько стратегий операций вложенных запросов: собственные, перетасовки и устаревшие версии.

Примечание.

Различие между nativeshuffle и стратегиями позволяет вызывающей стороне указывать кратность и стратегию выполнения вложенного запроса. Этот выбор может повлиять на время завершения вложенного запроса, но не изменяет конечный результат.

Собственная стратегия

Эта стратегия должна применяться, если количество различных значений ключа секции не имеет большого размера, примерно в тысячах.

Вложенный запрос должен быть табличным преобразованием, которое не указывает табличный источник. Источник неявен и назначается в соответствии с вложенными секциями. В подзапросе можно использовать только определенные поддерживаемые операторы . Нет ограничений на количество секций.

Чтобы использовать эту стратегию, укажите hint.strategy=native.

Стратегия перетасовки

Эта стратегия должна применяться, если число различных значений ключа секции большое, в миллионах.

Вложенный запрос должен быть табличным преобразованием, которое не указывает табличный источник. Источник неявен и назначается в соответствии с вложенными секциями. В подзапросе можно использовать только определенные поддерживаемые операторы . Нет ограничений на количество секций.

Чтобы использовать эту стратегию, укажите hint.strategy=shuffle. Дополнительные сведения о стратегии перетасовки и производительности см . в статье "Перетасовка запросов".

Поддерживаемые операторы для собственных и перетасовок стратегий

Следующий список операторов можно использовать в вложенных запросах с собственными стратегиями или стратегиями перетасовки:

Примечание.

  • Операторы, ссылающиеся на источник таблицы, отличные от вложенных секций, несовместимы с native и shuffle стратегиями. Например, присоединение, объединение, внешние данные и оценка (подключаемые модули). Для таких сценариев прибегите к устаревшей стратегии.
  • Оператор вилки не поддерживается для любого типа стратегии, так как вложенный запрос должен возвращать один табличный результат.

Устаревшая стратегия

По историческим причинам legacy стратегия является стратегией по умолчанию. Однако мы рекомендуем использовать собственные или перетасовки стратегии, так как legacy подход ограничен 64 секциями и менее эффективен.

В некоторых сценариях legacy стратегия может потребоваться из-за ее поддержки включения табличного источника в вложенный запрос. В таких случаях вложенный запрос может ссылаться только на ключевой столбец, столбец из входного табличного источника, T. Чтобы ссылаться на столбец, используйте синтаксис toscalar(столбца)

Если вложенный запрос является табличным преобразованием без табличного источника, источник неявен и основан на вложенных секциях.

Чтобы использовать эту стратегию, укажите или опустите hint.strategy=legacy любое другое указание стратегии.

Примечание.

Ошибка возникает, если столбец секционирования столбцасодержит более 64 различных значений.

Примеры

В примерах этого раздела показано, как использовать синтаксис для начала работы.

Примеры, приведенные в этой статье, используют общедоступные таблицы в кластера, например таблицу StormEvents в базе данных Samples.

В примерах этой статьи используются общедоступные таблицы, такие как таблица StormEvents в аналитике погоды примеры данных.

Поиск верхних значений

В некоторых случаях более производительно и проще писать запрос с помощью оператора, чем с помощью partitiontop-nested оператора. Следующий запрос выполняет вычисление вложенных запросов summarize и top для каждого State запуска с W: WYOMING, "ВАШИНГТОН", "ЗАПАДНАЯ ВИРДЖИНИЯ" и "WISCONSIN".

StormEvents
| where State startswith 'W'
| partition hint.strategy=native by State 
    (
    summarize Events=count(), Injuries=sum(InjuriesDirect) by EventType, State
    | top 3 by Events 
    ) 

Выходные данные

EventType Штат События Injuries
Град ВАЙОМИНГ 108 0
Очень сильный ветер ВАЙОМИНГ 81 5
Метель ВАЙОМИНГ 72 0
Метель ВАШИНГТОН 82 0
Очень сильный ветер ВАШИНГТОН 58 13
Wildfire ВАШИНГТОН 29 0
Ураганный ветер ЗАПАДНАЯ ВИРДЖИНИЯ 180 1
Град ЗАПАДНАЯ ВИРДЖИНИЯ 103 0
Холод ЗАПАДНАЯ ВИРДЖИНИЯ 88 0
Ураганный ветер WISCONSIN 416 1
Метель WISCONSIN 310 0
Град WISCONSIN 303 1

Собственная стратегия

Следующий запрос возвращает первые 2 EventType значения TotalInjuries для каждого State из них, начинающегося с W:

StormEvents
| where State startswith 'W'
| partition hint.strategy = native by State
    (
    summarize TotalInjueries = sum(InjuriesDirect) by EventType
    | top 2 by TotalInjueries
    )

Выходные данные

EventType TotalInjueries
Торнадо 4
Град 1
Ураганный ветер 1
Аномальная жара 0
Очень сильный ветер 13
Lightning 5
Очень сильный ветер 5
Лавина 3

Стратегия перетасовки

Следующий запрос возвращает первые 3 DamagedProperty значения для кэширования EpisodeId и столбцов EpisodeId и State.

StormEvents
| partition hint.strategy=shuffle by EpisodeId
    (
    top 3 by DamageProperty
    | project EpisodeId, State, DamageProperty
    )
| count

Выходные данные

Count
22345

Устаревшая стратегия с явным источником

Следующий запрос выполняет два вложенных запроса:

  • Когда x == 1запрос возвращает все строки из StormEvents них InjuriesIndirect == 1.
  • Когда x == 2запрос возвращает все строки из StormEvents них InjuriesIndirect == 2.

Окончательный результат — объединение этих двух вложенных запросов.

range x from 1 to 2 step 1
| partition hint.strategy=legacy by x {StormEvents | where x == InjuriesIndirect}
| count 

Выходные данные

Count
113

Справочник по секциям

В следующем примере показано, как использовать оператор as для предоставления имени каждому разделу данных, а затем повторно использовать это имя в вложенных запросах. Этот подход относится только к legacy стратегии.

T
| partition by Dim
(
    as Partition
    | extend MetricPct = Metric * 100.0 / toscalar(Partition | summarize sum(Metric))
)