다음을 통해 공유


mv-apply 연산자

적용 대상: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

각 레코드에 하위 쿼리를 적용하고 모든 하위 쿼리 결과의 합치를 반환합니다.

예를 들어 테이블에 T 값이 숫자 배열인 형식 dynamic 의 열 Metricreal 있다고 가정합니다. 다음 쿼리는 각 Metric 값에서 두 개의 가장 큰 값을 찾아 이러한 값에 해당하는 레코드를 반환합니다.

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

mv-apply 연산자에는 다음과 같은 처리 단계가 있습니다.

  1. 연산자를 mv-expand 사용하여 입력의 각 레코드를 하위 테이블로 확장합니다(순서는 유지됨).
  2. 각 하위 개체에 대해 하위 쿼리를 적용합니다.
  3. 결과 하위 개체에 0개 이상의 열을 추가합니다. 이러한 열에는 확장되지 않고 필요한 경우 반복되는 원본 열의 값이 포함됩니다.
  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 는 폼의 하나 이상의 요소에 대한 쉼표로 구분된 목록입니다.

[Name =] ArrayExpression [to typeof(Typename])

RowLimit 는 다음과 같습니다.

limitRowLimit

SubQuery 에는 쿼리 문과 동일한 구문이 있습니다.

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

매개 변수

이름 Type 필수 설명
ItemIndex string 배열 확장 단계의 일부로 입력에 추가되는 형식 long 열의 이름을 나타내고 확장된 값의 0부터 시작하는 배열 인덱스입니다.
이름 string 배열 확장된 각 식의 배열 확장 값을 할당할 이름입니다. 지정하지 않으면 열 이름이 사용 가능한 경우 사용됩니다. ArrayExpression이 단순 열 이름이 아닌 경우 임의의 이름이 생성됩니다.
ArrayExpression dynamic ✔️ 값이 배열 확장된 배열입니다. 식이 입력에 있는 열의 이름인 경우 입력 열이 입력에서 제거되고 동일한 이름의 새 열이 제거되거나 지정된 경우 ColumnName 이 출력에 나타납니다.
Typename string ArrayExpression 배열의 개별 요소가 사용하는 형식의 dynamic 이름입니다. 이 형식을 준수하지 않는 요소는 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

출력

인덱스 요소
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-apply 에서는 내부 mv-expand 와 함께 속성 모음에서 "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 values
555-555-1234 555-555-1212 46 {
"SourceNumber": "555-555-1234",
"TargetNumber": "555-555-1212"
}
555-555-1212     {
"SourceNumber": "555-555-1212"
}