mv-expand 연산자

다중 값 동적 배열 또는 속성 모음을 여러 레코드로 확장합니다.

mv-expandsummarize ... make-list()make-series와 같이 여러 값을 단일 동적 유형의 배열 또는 속성 모음으로 압축하는 집계 연산자의 반대라고 설명할 수 있습니다. (스칼라) 배열 또는 속성 모음의 각 요소는 연산자의 출력에 새 레코드를 생성합니다. 확장되지 않은 입력의 모든 열은 출력의 모든 레코드에 복제됩니다.

Syntax

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

T|mv-expand [kind=(bagarray | )] [Name=] ArrayExpression [to typeof(Typename)] [, [Name=] ArrayExpression [to typeof(Typename)] ...] [limitRowlimit]

구문 규칙에 대해 자세히 알아봅니다.

매개 변수

이름 형식 필수 Description
ColumnName, ArrayExpression string ✔️ 열 참조 또는 배열 또는 속성 모음을 포함하는 형식 dynamic 의 값이 있는 스칼라 식입니다. 배열 또는 속성 모음의 개별 최상위 요소는 여러 레코드로 확장됩니다.
ArrayExpression이 사용되고 Name이 입력 열 이름과 같지 않으면 확장된 값이 출력의 새 열로 확장됩니다. 그렇지 않으면 기존 ColumnName이 대체됩니다.
이름 string 새 열의 이름입니다.
Typename string ✔️ 연산자가 생성한 열의 형식이 되는 배열 요소의 기본 형식을 mv-expand 나타냅니다. 형식 적용 작업은 캐스트 전용이며, 구문 분석 또는 형식 변환을 포함하지 않습니다. 선언된 형식을 준수하지 않는 배열 요소는 값이 됩니다 null .
RowLimit int 각 원래 행에서 생성된 최대 행 수입니다. 기본값은 2147483647입니다. mvexpandmv-expand 연산자의 레거시 형식 및 사용되지 않는 형식입니다. 레거시 버전의 기본 행 제한은 128입니다.
IndexColumnName string 가 지정된 경우 with_itemindex 출력에는 원래 확장된 컬렉션에 있는 항목의 0부터 시작하는 인덱스가 포함된 IndexColumnName 이라는 다른 열이 포함됩니다.

반환

입력의 각 레코드에 대해 연산자는 다음과 같은 방식으로 결정된 대로 0개, 1개 또는 많은 레코드를 출력에 반환합니다.

  1. 확장되지 않은 입력 열이 원래 값과 함께 출력에 나타납니다. 단일 입력 레코드를 여러 출력 레코드로 확장하면 값은 모든 레코드에 복제됩니다.

  2. 확장되는 각 ColumnName 또는 ArrayExpression 에 대해 확장 모드에 설명된 대로 각 값에 대해 출력 레코드 수가 결정됩니다. 각 입력 레코드에 대해 최대 출력 레코드 수가 계산됩니다. 모든 배열 또는 속성 모음이 "병렬"로 확장되어 누락된 값(있는 경우)은 null 값으로 대체됩니다. 요소는 원래 배열/모음에 표시되는 순서대로 행으로 확장됩니다.

  3. 동적 값이 null이면 해당 값(null)에 대해 단일 레코드가 생성됩니다. 동적 값이 빈 배열 또는 속성 모음인 경우 해당 값에 대한 레코드가 생성되지 않습니다. 그렇지 않으면, 동적 값에 요소가 있으므로 많은 레코드가 생성됩니다.

to typeof() 절을 사용하여 명시적으로 입력하지 않는 한 확장 열은 dynamic 유형입니다.

확장 모드

속성 모음 확장의 두 가지 모드가 지원됩니다.

  • kind=bag 또는 bagexpansion=bag: 속성 모음이 단일 항목 속성 모음으로 확장됩니다. 이 모드가 기본 모드입니다.
  • kind=array 또는 bagexpansion=array: 속성 모음이 두 요소로 이루어진 [key,value] 배열 구조로 확장되며 키 및 값에 대한 균일한 액세스가 가능합니다. 이 모드에서는 예를 들어 속성 이름에 대해 고유한 카운트 집계를 실행할 수도 있습니다.

예제

단일 열 - 배열 확장

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

출력

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

출력

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]

출력

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

두 개의 열 압축

두 열을 확장하면 먼저 해당 열을 '압축'한 다음, 확장합니다.

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

출력

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

출력

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 

출력

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

출력

x 인덱스
1 0
2 1
3 2
4 3