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


Оператор mv-apply

Область применения: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Применяет вложенный запрос к каждой записи и возвращает объединение результатов всех вложенных запросов.

Например, предположим, что таблица T имеет столбец Metric типа dynamic , значения которого являются массивами real чисел. Следующий запрос находит два самых больших значения в каждом Metric значении и возвращает записи, соответствующие этим значениям.

T | mv-apply Metric to typeof(real) on 
(
   top 2 by Metric desc
)

Оператор mv-apply выполняет следующие действия по обработке:

  1. mv-expand Использует оператор для расширения каждой записи во входных данных в вложенные значения (порядок сохраняется).
  2. Применяет вложенный запрос для каждого из вложенных наборов.
  3. Добавляет к результирующей подсети ноль или больше столбцов. Эти столбцы содержат значения исходных столбцов, которые не развернуты, и повторяются при необходимости.
  4. Возвращает объединение результатов.

Оператор mv-apply получает следующие входные данные:

  1. Одно или несколько выражений, которые оцениваются в динамические массивы для расширения. Количество записей в каждой развернутой подсети — максимальная длина каждого из этих динамических массивов. Значения NULL добавляются, когда задано несколько выражений, а соответствующие массивы имеют разные длины.

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

    Примечание.

    Рекомендуется использовать имена столбцов по умолчанию.

  3. Типы данных элементов этих динамических массивов после расширения. Они становятся типами столбцов в вложенных таблицы. Если этот параметр не задан, используется значение dynamic.

  4. При необходимости имя столбца, добавляемого в вложенные таблице, указывающее 0-й индекс элемента в массиве, который привел к записи подсети.

  5. При необходимости максимальное число элементов массива для расширения.

Оператор mv-apply можно рассматривать как обобщение mv-expand оператора (на самом деле, последний может быть реализован бывшим, если вложенный запрос содержит только проекции).)

Синтаксис

T | mv-apply [ItemIndex] ColumnsToExpand [RowLimit] on ( SubQuery )

Где ItemIndex имеет синтаксис:

with_itemindex= IndexColumnName

ColumnsToExpand — это разделенный запятыми список одного или нескольких элементов формы:

[Имя=] ArrayExpression [to typeof(Typename])

RowLimit просто:

limitRowLimit

и 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"
}