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


Оператор mv-expand

Переключайте службы с помощью раскрывающегося списка Версия. Дополнительные сведения о навигации.
Область применения: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

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

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

Syntax

T|mv-expand [(kind=bag | )] [arraywith_itemindex=IndexColumnName] ColumnName [to typeof(Typename)] [,ColumnName ...] [limitRowlimit]

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

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

Parameters

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

Returns

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

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

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

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

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

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

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

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

Examples

Примеры, приведенные в этой статье, используют общедоступные таблицы в кластере справки, например StormEvents таблицу в базе данных Samples .

В примерах этой статьи используются общедоступные таблицы, такие как Weather таблица в коллекции примеров Weather Analytics. Возможно, потребуется изменить имя таблицы в примере запроса, чтобы она соответствовала таблице в рабочей области.

В примерах этого раздела показано, как использовать синтаксис для начала работы.

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

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

Output

a b
1 10
1 20
2 a
2 b

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

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

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

Output

a b
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]

Output

a b key val
1 ["prop1","a1"] prop1 a1
1 ["prop2","b1"] prop2 b1
2 ["prop1","a2"] prop1 a2
2 ["prop2","b2"] prop2 b2

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

Разверните два столбца сначала "zip" применимые столбцы, а затем разверните их:

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

Output

a b 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

Output

a b 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 

Output

ColumnName ColumnOrdinal DateType ColumnType
a 0 System.String string
b 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

Output

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