Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Переключайте службы с помощью раскрывающегося списка Версия. Дополнительные сведения о навигации.
Область применения: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel
Применяет вложенный запрос к каждой записи и возвращает объединение результатов всех вложенных запросов.
Например, предположим, что таблица T имеет столбец Metric типа dynamic , значения которого являются массивами real чисел. Следующий запрос находит два крупнейших значения в каждом Metric значении и возвращает записи, соответствующие этим значениям.
T | mv-apply Metric to typeof(real) on
(
top 2 by Metric desc
)
Оператор mv-apply выполняет следующие действия по обработке:
-
mv-expandИспользует оператор для расширения каждой записи во входных данных в вложенные значения (порядок сохраняется). - Применяет вложенный запрос для каждого из вложенных наборов.
- Добавляет к результирующей подсети ноль или больше столбцов. Эти столбцы содержат значения исходных столбцов, которые не развернуты, и повторяются при необходимости.
- Возвращает объединение результатов.
Оператор mv-apply получает следующие входные данные:
Одно или несколько выражений, которые оцениваются в динамические массивы для расширения. Количество записей в каждой развернутой подсети — максимальная длина каждого из этих динамических массивов. Значения NULL добавляются, когда задано несколько выражений, а соответствующие массивы имеют разные длины.
При необходимости имена, назначаемые значениям выражений после расширения. Эти имена становятся именами столбцов в вложенных таблицы. Если значение не указано, исходное имя столбца используется, когда выражение является ссылкой на столбец. В противном случае используется случайное имя.
Примечание.
Рекомендуется использовать имена столбцов по умолчанию.
Типы данных элементов этих динамических массивов после расширения. Эти типы данных становятся типами столбцов в вложенных таблицы. Если этот параметр не задан, используется значение
dynamic.При необходимости имя столбца, добавляемого в вложенные таблице, указывающее 0-й индекс элемента в массиве, который привел к записи подсети.
При необходимости максимальное число элементов массива для расширения.
Оператор mv-apply можно рассматривать как обобщение mv-expand оператора (на самом деле, последний может быть реализован бывшим, если вложенный запрос содержит только проекции).)
Синтаксис
T|mv-apply [ItemIndex] ColumnsToExpand [RowLimit] on(SubQuery)
Где ItemIndex имеет синтаксис:
with_itemindex
=
IndexColumnName
ColumnsToExpand — это разделенный запятыми список одного или нескольких элементов формы:
[Имя=] ArrayExpression [totypeof(Typename])
RowLimit просто:
limit
RowLimit
SubQuery имеет тот же синтаксис любой инструкции запроса.
Дополнительные сведения о соглашениях синтаксиса.
Параметры
| Имя (название) | Тип | Обязательно | Описание |
|---|---|---|---|
ItemIndex |
string |
Указывает имя столбца типа long , добавляемого к входным данным в рамках этапа расширения массива, и указывает индекс массива на основе 0 развернутого значения. |
|
Name |
string |
Имя для назначения развернутых массивом значений каждого развернутого массива выражения. Если этот столбец не указан, имя столбца используется при наличии. Случайное имя создается, если ArrayExpression не является простым именем столбца. | |
ArrayExpression |
dynamic |
✔️ | Массив, значения которого развернуты в массиве. Если выражение является именем столбца во входных данных, входной столбец удаляется из входных данных, а новый столбец с тем же именем или ColumnName , если он указан, отображается в выходных данных. |
Typename |
string |
Имя типа, который принимает отдельные элементы массива dynamicArrayExpression . Элементы, которые не соответствуют этому типу, заменяются значением NULL. Если не указано, dynamic используется по умолчанию. |
|
RowLimit |
int |
Ограничение количества записей для создания из каждой записи входных данных. Если не указано, используется 2147483647. | |
SubQuery |
string |
Табличное выражение запроса с неявным табличным источником, который применяется к каждой развернутой вложенной таблицы массива. |
Примечание.
mv-expand В отличие от оператора, mv-apply оператор не поддерживает bagexpand=array расширение. Если развернутое выражение является контейнером свойств, а не массивом, можно использовать внутренний mv-expand оператор (см. следующий пример).
Примеры
Просмотрите примеры и запустите их на странице запроса Обозревателя данных.
Внутреннее расширение mv-expand, выполняемое mv-apply
Запрос помогает понять, что mv-expand выполняется внутренне с помощью mv-apply
let data = datatable (index: int, Arr: dynamic)
[
0, dynamic([7]),
1, dynamic([6, 11, 7])
];
data
| mv-apply Arr2=Arr to typeof(long) on
(
take 100
)
Выходные данные
| индекс | Arr | Arr2 |
|---|---|---|
| 0 | [7] | 7 |
| 1 | [6, 11, 7] | 6 |
| 1 | [6, 11, 7] | 11 |
| 1 | [6, 11, 7] | 7 |
Получение крупнейшего элемента из массива
Запрос создает новый столбец с наибольшим элементом массива.
let data = datatable (index: int, Arr: dynamic)
[
0, dynamic([1, 5, 3]),
1, dynamic([10, 2, 5, 7])
];
data
| mv-apply topElem=Arr to typeof(long) on
(
top 1 by topElem
)
Выходные данные
| индекс | Arr | topElem |
|---|---|---|
| 0 | [1, 5, 3] | 5 |
| 1 | [10, 2, 5, 7] | 10 |
Поиск первых двух элементов в массиве
Запрос сохраняет первые два элемента массива в новом столбце массива Top2.
let data = datatable (index: int, Arr: dynamic)
[
0, dynamic([5, 1, 3]),
1, dynamic([4, 10, 8, 7])
];
data
| mv-apply Arr2=Arr to typeof(long) on
(
top 2 by Arr2
| summarize Top2=make_list(Arr2)
)
Выходные данные
| индекс | Arr | Top2 |
|---|---|---|
| 0 | [5, 1, 3] | [5, 3] |
| 1 | [4, 10, 8, 7] | [10, 8] |
Выбор элементов в массивах
Запрос определяет первые два элемента из каждого динамического массива на основе значений Arr2 и суммирует их в новые списки.
datatable (Val:int, Arr1:dynamic, Arr2:dynamic)
[ 1, dynamic(['A1', 'A2', 'A3']), dynamic([10, 30, 7]),
7, dynamic(['B1', 'B2', 'B5']), dynamic([15, 11, 50]),
3, dynamic(['C1', 'C2', 'C3', 'C4']), dynamic([6, 40, 20, 8])
]
| mv-apply NewArr1=Arr1, NewArr2=Arr2 to typeof(long) on (
top 2 by NewArr2
| summarize NewArr1=make_list(NewArr1), NewArr2=make_list(NewArr2)
)
Выходные данные
| Val1 | Arr1 | Arr2 | NewArr1 |
NewArr2 |
|---|---|---|---|---|
| 1 | ["A1","A2","A3"] |
[10,30,7] |
["A2',"A1"] |
[30,10] |
| 7 | ["B1","B2","B5"] |
[15,11,50] |
["B5","B1"] |
[50,15] |
| 3 | ["C1","C2","C3","C4"] |
[6,40,20,8] |
["C2","C3"] |
[40,20] |
Использование with_itemindex для работы с подмножеством массива
Запрос приводит к таблице с строками, в которых индекс равен 2 или больше, включая значения индекса и элемента из исходных списков.
let data = datatable (row: int, Arr: dynamic)
[
0, dynamic([5, 1, 3]),
1, dynamic([4, 10, 8, 7])
];
data
| mv-apply with_itemindex=index value=Arr to typeof(long) on
(
// here you have 'index' column
where index >= 2
)
Выходные данные
| ряд | Arr | value |
index |
|---|---|---|---|
| 0 | [5, 1, 3] | 3 | 2 |
| 1 | [4, 10, 8, 7] | 8 | 2 |
| 1 | [4, 10, 8, 7] | 7 | 3 |
Использование нескольких столбцов для соединения элемента двух массивов
Запрос объединяет элементы из двух динамических массивов в новый объединенный формат, а затем суммирует их в списки.
datatable (Val: int, Arr1: dynamic, Arr2: dynamic)
[
1, dynamic(['A1', 'A2']), dynamic(['B1', 'B2', 'B3']),
5, dynamic(['C1', 'C2']), dynamic(['D1'])
]
| mv-apply T1=Arr1, T2=Arr2 on (
extend Out = strcat(T1, "_", T2)
| summarize Out= make_list(Out)
)
Выходные данные
| Валь | Arr1 | Arr2 | Out |
|---|---|---|---|
| 1 | ["A1","A2"] | ["B1","B2","B3"] | ["A1_B1","A2_B2","_B3"] |
| 5 | ["C1","C2"] | ["D1"] | ["C1_D1","C2_"] |
Применение mv-apply к контейнеру свойств
Этот запрос динамически удаляет свойства из объекта упакованных значений на основе условий, которые их значения не начинаются с 555. Окончательный результат содержит исходные столбцы с удаленными нежелательными свойствами.
datatable(Source: string, Target: string, Count: long)
[
'555-1234', '555-1212', 46,
'555-2424', '', int(null)
]
| extend Pack = pack_all()
| mv-apply removeProperties = Pack on
(
mv-expand kind = array Pack
| where Pack[1] !startswith "555"
| summarize propsToRemove = make_set(Pack[0])
)
| extend values = bag_remove_keys(Pack, propsToRemove)
| project-away propsToRemove
Выходные данные
| Исходный материал | Цель | Численность | Упаковывать | values |
|---|---|---|---|---|
| 555-1234 | 555-1212 | 46 | {} "Источник": "555-1234", "Target": "555-1212", "Count": 46 } |
{} "Источник": "555-1234", "Target": "555-1212" } |
| 555-2424 | {} "Источник": "555-2424", "Target": "", "Count": null } |
{} "Источник": "555-2424" } |
Связанный контент
- Оператор mv-expand
- функция array_iff