Оператор 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 разными узлами кластера в зависимости от указания параллелизма. |
Возвраты
Оператор возвращает объединение результатов отдельных вложенных запросов.
Стратегии
Оператор секционирования поддерживает несколько стратегий операций вложенных запросов: собственные, перетасовки и устаревшие версии.
Примечание.
Различие между native
shuffle
и стратегиями позволяет вызывающей стороне указывать кратность и стратегию выполнения вложенного запроса. Этот выбор может повлиять на время завершения вложенного запроса, но не изменяет конечный результат.
Собственная стратегия
Эта стратегия должна применяться, если количество различных значений ключа секции не имеет большого размера, примерно в тысячах.
Вложенный запрос должен быть табличным преобразованием, которое не указывает табличный источник. Источник неявен и назначается в соответствии с вложенными секциями. В подзапросе можно использовать только определенные поддерживаемые операторы . Нет ограничений на количество секций.
Чтобы использовать эту стратегию, укажите hint.strategy=native
.
Стратегия перетасовки
Эта стратегия должна применяться, если число различных значений ключа секции большое, в миллионах.
Вложенный запрос должен быть табличным преобразованием, которое не указывает табличный источник. Источник неявен и назначается в соответствии с вложенными секциями. В подзапросе можно использовать только определенные поддерживаемые операторы . Нет ограничений на количество секций.
Чтобы использовать эту стратегию, укажите hint.strategy=shuffle
. Дополнительные сведения о стратегии перетасовки и производительности см . в статье "Перетасовка запросов".
Поддерживаемые операторы для собственных и перетасовок стратегий
Следующий список операторов можно использовать в вложенных запросах с собственными стратегиями или стратегиями перетасовки:
- count
- distinct
- extend
- make-series
- mv-apply
- mv-expand
- parse
- parse-where
- project
- project-away
- project-keep
- project-rename
- project-reorder
- reduce
- sample
- sample-distinct
- scan
- search
- издавать выпусками
- sort
- summarize
- take
- top
- top-hitters
- top-nested
- where
Примечание.
- Операторы, ссылающиеся на источник таблицы, отличные от вложенных секций, несовместимы с
native
иshuffle
стратегиями. Например, присоединение, объединение, внешние данные и оценка (подключаемые модули). Для таких сценариев прибегите к устаревшей стратегии. - Оператор вилки не поддерживается для любого типа стратегии, так как вложенный запрос должен возвращать один табличный результат.
Устаревшая стратегия
По историческим причинам legacy
стратегия является стратегией по умолчанию. Однако мы рекомендуем использовать собственные или перетасовки стратегии, так как legacy
подход ограничен 64 секциями и менее эффективен.
В некоторых сценариях legacy
стратегия может потребоваться из-за ее поддержки включения табличного источника в вложенный запрос. В таких случаях вложенный запрос может ссылаться только на ключевой столбец, столбец из входного табличного источника, T. Чтобы ссылаться на столбец, используйте синтаксис toscalar(
столбца)
Если вложенный запрос является табличным преобразованием без табличного источника, источник неявен и основан на вложенных секциях.
Чтобы использовать эту стратегию, укажите или опустите hint.strategy=legacy
любое другое указание стратегии.
Примечание.
Ошибка возникает, если столбец секционирования столбцасодержит более 64 различных значений.
Примеры
В примерах этого раздела показано, как использовать синтаксис для начала работы.
Примеры, приведенные в этой статье, используют общедоступные таблицы в кластера, например таблицу
StormEvents
в базе данных Samples.
В примерах этой статьи используются общедоступные таблицы, такие как таблица
StormEvents
в аналитике погоды примеры данных.
Поиск верхних значений
В некоторых случаях более производительно и проще писать запрос с помощью оператора, чем с помощью partition
top-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))
)