Оператор partition

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

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

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

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

Синтаксис

T|partition [ hint.strategy=Стратегия ] [ Указания ] byПреобразование столбцаSubQuery()

T|partition [ hint.strategy=legacy ] [ Hints ] byColumn{SubQueryWithSource}

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

Параметры

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

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

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

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

Поддерживаемые указания

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

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

Возвращаемое значение

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

Стратегии

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

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

Примечание

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

Примеры

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

В некоторых случаях создание запроса с помощью partition оператора является более производительным и более простым, чем с помощью top-nested оператора . Следующий запрос выполняет вычисление summarize вложенных запросов и top для каждого из них State , начиная с W: "WYOMING", "WASHINGTON", "WEST VIRGINIA" и "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 Состояние События Травм
Град ВАЙОМИНГ 108 0
Очень сильный ветер ВАЙОМИНГ 81 5
Метель ВАЙОМИНГ 72 0
Сильный снег ВАШИНГТОН 82 0
Очень сильный ветер ВАШИНГТОН 58 13
Wildfire ВАШИНГТОН 29 0
Шквалистый ветер ЗАПАДНАЯ ВИРДЖИНИЯ 180 1
Град ЗАПАДНАЯ ВИРДЖИНИЯ 103 0
Зимняя погода ЗАПАДНАЯ ВИРДЖИНИЯ 88 0
Шквалистый ветер ВИСКОНСИН 416 1
Метель ВИСКОНСИН 310 0
Град ВИСКОНСИН 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

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

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

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

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

Count
22345

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

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

  • При x == 1значении запрос возвращает все строки из , имеющие StormEventsInjuriesIndirect == 1.
  • При x == 2значении запрос возвращает все строки из , имеющие StormEventsInjuriesIndirect == 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))
)