operator mv-apply
Dotyczy: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Stosuje podzapytywanie do każdego rekordu i zwraca unię wyników wszystkich podzapytania.
Załóżmy na przykład, że tabela T
ma kolumnę Metric
typu dynamic
, której wartości są tablicami real
liczb. Poniższe zapytanie lokalizuje dwie największe wartości w każdej Metric
wartości i zwraca rekordy odpowiadające tym wartościom.
T | mv-apply Metric to typeof(real) on
(
top 2 by Metric desc
)
Operator mv-apply
ma następujące kroki przetwarzania:
mv-expand
Używa operatora do rozwijania każdego rekordu w danych wejściowych do podtabli (kolejność jest zachowywana).- Stosuje podzapytywanie dla każdej z podtabli.
- Dodaje zero lub więcej kolumn do wynikowej tabeli podrzędnej. Te kolumny zawierają wartości kolumn źródłowych, które nie są rozwinięte i są powtarzane w razie potrzeby.
- Zwraca unię wyników.
Operator mv-apply
pobiera następujące dane wejściowe:
Co najmniej jedno wyrażenie, które ocenia w tablicach dynamicznych w celu rozwinięcia. Liczba rekordów w każdej rozwiniętej tabeli podrzędnej jest maksymalną długością każdej z tych tablic dynamicznych. Wartości null są dodawane, gdy określono wiele wyrażeń, a odpowiadające im tablice mają różne długości.
Opcjonalnie nazwy do przypisania wartości wyrażeń po rozszerzeniu. Te nazwy stają się nazwami kolumn w podtabelach. Jeśli nie zostanie określona, oryginalna nazwa kolumny jest używana, gdy wyrażenie jest odwołaniem do kolumny. W przeciwnym razie jest używana losowa nazwa.
Uwaga
Zaleca się używanie domyślnych nazw kolumn.
Typy danych elementów tych tablic dynamicznych po rozwinięciu. Stają się one typami kolumn w podtabelach. Jeśli nie zostanie określony,
dynamic
zostanie użyty.Opcjonalnie nazwa kolumny, która ma zostać dodana do podtabli, która określa 0-oparty na indeksie elementu w tablicy, co spowodowało utworzenie rekordu podtabli.
Opcjonalnie maksymalna liczba elementów tablicy do rozwinięcia.
Operator mv-apply
można traktować jako uogólnienie mv-expand
operatora (w rzeczywistości ten ostatni może być implementowany przez ten pierwszy, jeśli podzapytywanie zawiera tylko projekcje).
Składnia
T |
mv-apply
[ItemIndex] ColumnsToExpand [RowLimit] on
(
SubQuery )
Gdzie element ItemIndex ma składnię:
with_itemindex
=
IndexColumnName
ColumnsToExpand to rozdzielana przecinkami lista co najmniej jednego elementu formularza:
[Name =
] ArrayExpression [to
typeof
(
Typename])
WierszLimit to po prostu:
limit
Wierszlimit
i SubQuery ma tę samą składnię dowolnej instrukcji zapytania.
Dowiedz się więcej na temat konwencji składni.
Parametry
Nazwisko | Type | Wymagania | opis |
---|---|---|---|
ItemIndex | string |
Wskazuje nazwę kolumny typu long dołączonego do danych wejściowych w ramach fazy rozszerzania tablicy i wskazuje indeks tablicy rozszerzonej wartości na podstawie 0. |
|
Nazwa/nazwisko | string |
Nazwa do przypisania wartości rozwiniętej tablicy każdego wyrażenia rozwiniętego tablicą. Jeśli nie zostanie określona, nazwa kolumny jest używana, jeśli jest dostępna. Losowa nazwa jest generowana, jeśli ArrayExpression nie jest prostą nazwą kolumny. | |
ArrayExpression | dynamic |
✔️ | Tablica, której wartości są rozwinięte w tablicy. Jeśli wyrażenie jest nazwą kolumny w danych wejściowych, kolumna wejściowa zostanie usunięta z danych wejściowych i nowa kolumna o tej samej nazwie lub Nazwakolumny , jeśli zostanie określona, pojawi się w danych wyjściowych. |
Nazwa typu | string |
Nazwa typu, który przyjmują poszczególne elementy dynamic tablicy ArrayExpression . Elementy, które nie są zgodne z tym typem, są zastępowane wartością null. Jeśli nieokreślone, dynamic jest używany domyślnie. |
|
Wierszlimit | int |
Limit liczby rekordów do wygenerowania z każdego rekordu danych wejściowych. Jeśli nie określono, 2147483647 jest używana. | |
Podzapytywanie | string |
Wyrażenie zapytania tabelarycznego z niejawnym źródłem tabelarycznym, które jest stosowane do każdej tabeli rozwijanej tablicy. |
Uwaga
mv-expand
W przeciwieństwie do operatora operator mv-apply
nie obsługuje bagexpand=array
rozszerzania. Jeśli wyrażenie do rozwinięcia jest workiem właściwości, a nie tablicą, możesz użyć operatora wewnętrznego mv-expand
(zobacz przykład poniżej).
Przykłady
Pobieranie największego elementu z tablicy
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
)
Wyjście
xMod2 |
l | — element |
---|---|---|
1 | [1, 3, 5, 7] | 7 |
0 | [2, 4, 6, 8] | 8 |
Obliczanie sumy największych dwóch elementów w tablicy
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)
)
Wyjście
xMod2 |
l | SumOfTop2 |
---|---|---|
1 | [1,3,5,7] | 12 |
0 | [2,4,6,8] | 14 |
Wybieranie elementów w tablicach
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)
)
Wyjście
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] |
Używanie with_itemindex
do pracy z podzbiorem tablicy
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
Wyjście
index | — element |
---|---|
3 | 7 |
100 | 9 |
3 | 8 |
4 | 10 |
Używanie kolumn mutiple do sprzężenia elementu z 2 tablicami
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)
)
Wyjście
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"] |
Stosowanie mv-apply do torby właściwości
W poniższym przykładzie mv-apply
jest używany w połączeniu z wewnętrznym mv-expand
, aby usunąć wartości, które nie zaczynają się od "555" z torby właściwości:
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
Wyjście
Numer źródła | Numer docelowy | CharsCount | wartości |
---|---|---|---|
555-555-1234 | 555-555-1212 | 46 | { "SourceNumber": "555-555-1234", "TargetNumber": "555-555-1212" } |
555-555-1212 | { "SourceNumber": "555-555-1212" } |