Оператор mv-apply
Область применения: ✅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 [to
typeof
(
Typename])
RowLimit просто:
limit
RowLimit
и SubQuery имеют одинаковый синтаксис любой инструкции запроса.
Дополнительные сведения о соглашениях синтаксиса.
Параметры
Имя (название) | Type | Обязательно | Описание |
---|---|---|---|
ItemIndex | string |
Указывает имя столбца типа long , добавляемого к входным данным в рамках этапа расширения массива, и указывает индекс массива на основе 0 развернутого значения. |
|
Имя | string |
Имя для назначения развернутых массивом значений каждого развернутого массива выражения. Если этот столбец не указан, имя столбца используется при наличии. Случайное имя создается, если ArrayExpression не является простым именем столбца. | |
ArrayExpression | dynamic |
✔️ | Массив, значения которого развернуты в массиве. Если выражение является именем столбца во входных данных, входной столбец удаляется из входных данных, а новый столбец с тем же именем или ColumnName , если он указан, отображается в выходных данных. |
Имя типа | string |
Имя типа, который принимает отдельные элементы массива dynamic ArrayExpression . Элементы, которые не соответствуют этому типу, заменяются значением NULL. Если не указано, dynamic используется по умолчанию. |
|
RowLimit | int |
Ограничение количества записей для создания из каждой записи входных данных. Если не указано, используется 2147483647. | |
SubQuery | string |
Табличное выражение запроса с неявным табличным источником, который применяется к каждой развернутой вложенной таблицы массива. |
Примечание.
mv-expand
В отличие от оператора, mv-apply
оператор не поддерживает bagexpand=array
расширение. Если развернутое выражение является контейнером свойств, а не массивом, можно использовать внутренний mv-expand
оператор (см. пример ниже).
Примеры
Получение крупнейшего элемента из массива
let _data =
range x from 1 to 8 step 1
| summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply element=l to typeof(long) on
(
top 1 by element
)
Выходные данные
xMod2 |
l | элемент |
---|---|---|
1 | [1, 3, 5, 7] | 7 |
0 | [2, 4, 6, 8] | 8 |
Вычисление суммы крупнейших двух элементов в массиве
let _data =
range x from 1 to 8 step 1
| summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply l to typeof(long) on
(
top 2 by l
| summarize SumOfTop2=sum(l)
)
Выходные данные
xMod2 |
l | SumOfTop2 |
---|---|---|
1 | [1,3,5,7] | 12 |
0 | [2,4,6,8] | 14 |
Выбор элементов в массивах
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
для работы с подмножеством массива
let _data =
range x from 1 to 10 step 1
| summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply with_itemindex=index element=l to typeof(long) on
(
// here you have 'index' column
where index >= 3
)
| project index, element
Выходные данные
index | элемент |
---|---|
3 | 7 |
4 | 9 |
3 | 8 |
4 | 10 |
Использование мутиповых столбцов для соединения элемента из 2 массивов
datatable (Val: int, Arr1: dynamic, Arr2: dynamic)
[
1, dynamic(['A1', 'A2', 'A3']), dynamic(['B1', 'B2', 'B3']),
5, dynamic(['C1', 'C2']), dynamic(['D1', 'D2'])
]
| mv-apply Arr1, Arr2 on (
extend Out = strcat(Arr1, "_", Arr2)
| summarize Arr1 = make_list(Arr1), Arr2 = make_list(Arr2), Out= make_list(Out)
)
Выходные данные
Val | Arr1 | Arr2 | Out |
---|---|---|---|
1 | ["A1","A2","A3"] | ["B1","B2","B3"] | ["A1_B1","A2_B2","A3_B3"] |
5 | ["C1","C2"] | ["D1","D2"] | ["C1_D1","C2_D2"] |
Применение mv-apply к контейнеру свойств
В следующем примере используется в сочетании с внутренним mv-expand
для удаления значений, mv-apply
которые не начинаются с "555" из контейнера свойств:
datatable(SourceNumber: string, TargetNumber: string, CharsCount: long)
[
'555-555-1234', '555-555-1212', 46,
'555-555-1212', '', int(null)
]
| extend values = pack_all()
| mv-apply removeProperties = values on
(
mv-expand kind = array values
| where values[1] !startswith "555"
| summarize propsToRemove = make_set(values[0])
)
| extend values = bag_remove_keys(values, propsToRemove)
| project-away propsToRemove
Выходные данные
SourceNumber | TargetNumber | CharsCount | Значения |
---|---|---|---|
555-555-1234 | 555-555-1212 | 46 | { SourceNumber: "555-555-1234", TargetNumber: "555-555-1212" } |
555-555-1212 | { SourceNumber: "555-555-1212" } |