mv-apply 연산자
적용 대상: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
각 레코드에 하위 쿼리를 적용하고 모든 하위 쿼리 결과의 합치를 반환합니다.
예를 들어 테이블에 T
값이 숫자 배열인 형식 dynamic
의 열 Metric
이 real
있다고 가정합니다. 다음 쿼리는 각 Metric
값에서 두 개의 가장 큰 값을 찾아 이러한 값에 해당하는 레코드를 반환합니다.
T | mv-apply Metric to typeof(real) on
(
top 2 by Metric desc
)
mv-apply
연산자에는 다음과 같은 처리 단계가 있습니다.
- 연산자를
mv-expand
사용하여 입력의 각 레코드를 하위 테이블로 확장합니다(순서는 유지됨). - 각 하위 개체에 대해 하위 쿼리를 적용합니다.
- 결과 하위 개체에 0개 이상의 열을 추가합니다. 이러한 열에는 확장되지 않고 필요한 경우 반복되는 원본 열의 값이 포함됩니다.
- 결과의 합을 반환합니다.
연산자는 mv-apply
다음 입력을 가져옵니다.
확장할 동적 배열로 계산되는 하나 이상의 식입니다. 확장된 각 하위 테이블의 레코드 수는 각 동적 배열의 최대 길이입니다. 여러 식이 지정되고 해당 배열의 길이가 다른 경우 Null 값이 추가됩니다.
필요에 따라 확장 후 식 값을 할당할 이름입니다. 이러한 이름은 하위 테이블의 열 이름이 됩니다. 지정하지 않으면 식이 열 참조일 때 열의 원래 이름이 사용됩니다. 그렇지 않으면 임의 이름이 사용됩니다.
참고 항목
기본 열 이름을 사용하는 것이 좋습니다.
확장 후 해당 동적 배열 요소의 데이터 형식입니다. 이러한 열은 하위 개체에 있는 열의 열 형식이 됩니다. 지정되지 않은 경우
dynamic
가 사용됩니다.필요에 따라 하위 개체 레코드를 생성한 배열에 있는 요소의 0부터 시작하는 인덱스를 지정하는 하위 개체에 추가할 열의 이름입니다.
필요에 따라 확장할 배열 요소의 최대 수입니다.
연산자는 mv-apply
연산자의 mv-expand
일반화로 간주할 수 있습니다(실제로 하위 쿼리에 프로젝션만 포함된 경우 후자는 전자에서 구현할 수 있습니다.)
구문
T |
mv-apply
[ItemIndex] ColumnsToExpand [RowLimit] on
(
SubQuery )
ItemIndex의 구문은 다음과 같습니다.
with_itemindex
=
IndexColumnName
ColumnsToExpand 는 폼의 하나 이상의 요소에 대한 쉼표로 구분된 목록입니다.
[Name =
] ArrayExpression [to
typeof
(
Typename])
RowLimit 는 다음과 같습니다.
limit
RowLimit
및 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" } |
관련 콘텐츠
- mv-expand 연산자