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


Оператор mv-expand

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

Развертывает динамические массивы с несколькими значениями или контейнеры свойств в несколько записей.

mv-expand можно описать как противоположность операторам агрегирования, которые упаковывают множество значений в один массив или контейнер свойств динамического типа, например summarize ... make-list() и make-series. Каждый элемент в (скалярном) массиве или контейнере свойств создает новую запись в выходных данных оператора. Все неразвернутые столбцы входных данных дублируются для всех записей в выходных данных.

Синтаксис

T |mv-expand [kind=(bagarray | )] [with_itemindex= IndexColumnName] ColumnName [to typeof( Typename)] [, ColumnName ...] [limit Rowlimit]

T [(bag | array)] [kind=Имя=] ArrayExpression [to typeof(Typename)] [, Имя = ] ArrayExpression [to typeof(Typename)] ...] [limit Rowlimit]|mv-expand

Дополнительные сведения о соглашениях синтаксиса.

Параметры

Имя (название) Type Обязательно Описание
ColumnName, ArrayExpression string ✔️ Ссылка на столбец или скалярное выражение со значением типа dynamic , в котором содержится массив или контейнер свойств. Отдельные элементы верхнего уровня в массиве или контейнере свойств развертываются в несколько записей.
Если используется ArrayExpression, а Name не совпадает с именем столбца входных данных, развернутое значение расширяется в новый столбец в выходных данных. В противном случае заменяется существующее значение ColumnName.
Имя string Имя нового столбца.
Имя типа string ✔️ указывает базовый тип элементов массива, который станет типом столбца, созданного оператором mv-expand. Операция применения типа предназначена только для приведения и не включает синтаксический анализ или преобразование типа. Элементы массива, которые не соответствуют объявленному типу, становятся null значениями.
RowLimit int Максимальное количество строк, созданных из каждой исходной строки. Значение по умолчанию — 2147483647. mvexpand является прежней версией и устаревшей формой оператора mv-expand. В прежней версии по умолчанию используется ограничение в 128 строк.
IndexColumnName string Если with_itemindex задано, выходные данные включают другой столбец с именем IndexColumnName , содержащий индекс, начиная с 0 элемента в исходной развернутой коллекции.

Возвраты

Для каждой записи во входных данных оператор возвращает в выходных данных нуль, одну или несколько записей в соответствии со следующим определением:

  1. Неразвернутые входные столбцы отображаются в выходных данных с исходными значениями. Если одна входная запись развертывается в несколько выходных записей, значение дублируется во всех записях.

  2. Для каждого развернутого объекта ColumnName или ArrayExpression количество выходных записей определяется для каждого значения, как описано в режимах расширения. Для каждой входной записи вычисляется максимальное число выходных записей. Все массивы или контейнеры свойств развертываются параллельно, чтобы отсутствующие значения (если они есть) заменялись значениями NULL. Элементы развертываются в строки в том порядке, в котором они отображаются в исходном массиве или контейнере.

  3. Если динамическое значение равно NULL, то для этого значения создается одна запись (NULL). Если динамическое значение — пустой массив или контейнер свойств, запись для этого значения не создается. В противном случае создается количество записей, равное количеству элементов в динамическом значении.

Развернутые столбцы имеют тип dynamic, если тип не указан явно с помощью предложения to typeof().

Режимы развертывания

Поддерживаются два режима развертывания контейнера свойств.

  • kind=bag или bagexpansion=bag: пакеты свойств расширяются в пакеты свойств с одним входом. Этот режим используется по умолчанию.
  • kind=arrayилиbagexpansion=array: пакеты свойств расширяются в структуры массива значений] ключей двух элементов[, что позволяет обеспечить универсальный доступ к ключам,и значениям. Кроме того, этот режим позволяет выполнять, например, подсчет различных значений в именах свойств.

Примеры

Один столбец — расширение массива

datatable (a: int, b: dynamic)
[
    1, dynamic([10, 20]),
    2, dynamic(['a', 'b'])
]
| mv-expand b

Выходные данные

a б
1 10
1 20
2 a
2 б

Один столбец — расширение контейнера

Простое развертывание одного столбца:

datatable (a: int, b: dynamic)
[
    1, dynamic({"prop1": "a1", "prop2": "b1"}),
    2, dynamic({"prop1": "a2", "prop2": "b2"})
]
| mv-expand b

Выходные данные

a б
1 {"prop1": "a1"}
1 {"prop2": "b1"}
2 {"prop1": "a2"}
2 {"prop2": "b2"}

Один столбец — расширение пакета до пар "ключ-значение"

Простое расширение пакета к парам "ключ-значение":

datatable (a: int, b: dynamic)
[
    1, dynamic({"prop1": "a1", "prop2": "b1"}),
    2, dynamic({"prop1": "a2", "prop2": "b2"})
]
| mv-expand kind=array b 
| extend key = b[0], val=b[1]

Выходные данные

a б key val
1 ["prop1","a1"] prop1 А1
1 ["prop2","b1"] prop2 b1
2 ["prop1","a2"] prop1 А2
2 ["prop2","b2"] prop2 Б2

Сжатые два столбца

При развертывании двух столбцов применимые столбцы сначала будут сжаты, а затем развернуты:

datatable (a: int, b: dynamic, c: dynamic)[
    1, dynamic({"prop1": "a", "prop2": "b"}), dynamic([5, 4, 3])
]
| mv-expand b, c

Выходные данные

a б c
1 {"prop1":"a"} 5
1 {"prop2":"b"} 4
1 3

Декартово произведение двух столбцов

Если вы хотите получить декартово произведение для развертывания двух столбцов, разверните по очереди:

datatable (a: int, b: dynamic, c: dynamic)
[
    1, dynamic({"prop1": "a", "prop2": "b"}), dynamic([5, 6])
]
| mv-expand b
| mv-expand c

Выходные данные

a б c
1 { "prop1": "a"} 5
1 { "prop1": "a"} 6
1 { "prop2": "b"} 5
1 { "prop2": "b"} 6

Преобразование вывода

Чтобы принудительно развернуть выходные данные mv-expand до определенного типа (по умолчанию — динамический), используйте to typeof:

datatable (a: string, b: dynamic, c: dynamic)[
    "Constant", dynamic([1, 2, 3, 4]), dynamic([6, 7, 8, 9])
]
| mv-expand b, c to typeof(int)
| getschema 

Выходные данные

ColumnName ColumnOrdinal DateType ColumnType
a 0 System.String string
б 1 System.Object dynamic
c 2 System.Int32 int

Обратите внимание: столбец b возвращается как столбец типа dynamic, а c — как столбец типа int.

Использование with_itemindex

Расширение массива с помощью with_itemindex:

range x from 1 to 4 step 1
| summarize x = make_list(x)
| mv-expand with_itemindex=Index x

Выходные данные

x Индекс
1 0
2 1
3 2
4 3
  • Оператор mv-apply.
  • Для противоположности оператора mv-expand см . сводку make_list().
  • Сведения о расширении динамических объектов JSON в столбцах с помощью ключей контейнера свойств см. в подключаемых модулях bag_unpack().