Udostępnij za pośrednictwem


operator mv-apply

Dotyczy: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft 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:

  1. mv-expand Używa operatora do rozwijania każdego rekordu w danych wejściowych do podtabli (kolejność jest zachowywana).
  2. Stosuje podzapytywanie dla każdej z podtabli.
  3. 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.
  4. Zwraca unię wyników.

Operator mv-apply pobiera następujące dane wejściowe:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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:

limitWierszlimit

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"
}