다음을 통해 공유


mv-apply 연산자

적용 대상: ✅Microsoft Fabric

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

예를 들어 테이블에 T 값이 숫자 배열인 형식 Metric 의 열 dynamicreal 있다고 가정합니다. 다음 쿼리는 각 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 [totypeof(Typename])

RowLimit 는 다음과 같습니다.

limit RowLimit

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

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

매개 변수

이름 Type 필수 설명
ItemIndex string 배열 확장 단계의 일부로 입력에 추가되는 형식 long 열의 이름을 나타내고 확장된 값의 0부터 시작하는 배열 인덱스입니다.
이름 string 배열 확장된 각 식의 배열 확장 값을 할당할 이름입니다. 지정하지 않으면 열 이름이 사용 가능한 경우 사용됩니다. ArrayExpression이 단순 열 이름이 아닌 경우 임의의 이름이 생성됩니다.
ArrayExpression dynamic ✔️ 값이 배열 확장된 배열입니다. 식이 입력에 있는 열의 이름인 경우 입력 열이 입력에서 제거되고 동일한 이름의 새 열이 제거되거나 지정된 경우 ColumnName 이 출력에 나타납니다.
Typename string ArrayExpressiondynamic의 개별 요소가 사용하는 형식의 이름입니다. 이 형식을 준수하지 않는 요소는 null 값으로 대체됩니다. 지정 dynamic 되지 않은 경우 기본적으로 사용됩니다.
RowLimit int 입력의 각 레코드에서 생성할 레코드 수에 대한 제한입니다. 지정되지 않은 경우 2147483647 사용됩니다.
SubQuery string 배열 확장된 각 하위 테이블마다 적용되는 암시적 테이블 형식 원본이 있는 테이블 형식 쿼리 식입니다.

참고 항목

연산자와 mv-expand 달리 연산자는 mv-apply 확장을 지원하지 bagexpand=array 않습니다. 확장할 식이 배열이 아닌 속성 모음인 경우 내부 mv-expand 연산자를 사용할 수 있습니다(아래 예제 참조).

예제

예제를 검토하고 데이터 탐색기 쿼리 페이지에서 실행합니다.

배열에서 가장 큰 요소 가져오기

쿼리는 가장 작은 짝수(2)와 가장 작은 홀수(1)를 출력합니다.

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

배열에서 가장 큰 두 요소의 합계 계산

쿼리는 상위 2개의 짝수(6 + 8 = 14)와 상위 2개의 홀수(5 + 7 = 12)의 합계를 출력합니다.

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

배열에서 요소 선택

쿼리는 Arr2 값을 기반으로 각 동적 배열의 상위 2개 요소를 식별하고 새 목록으로 요약합니다.

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

쿼리는 원래 짝수 및 홀수 목록의 인덱스 및 요소 값을 포함하여 인덱스가 3 이상인 행이 있는 테이블을 만듭니다.

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 적용

이 쿼리는 값이 "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"
}