Оператор 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 выполняет следующие действия по обработке:

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