Dela via


mv-apply-operator

Gäller för: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Tillämpar en underfråga på varje post och returnerar union av resultaten för alla underfrågor.

Anta till exempel att en tabell T har en kolumn Metric av typen dynamic vars värden är matriser med real tal. Följande fråga letar upp de två största värdena i varje Metric värde och returnerar de poster som motsvarar dessa värden.

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

Operatorn mv-apply har följande bearbetningssteg:

  1. Använder operatorn mv-expand för att expandera varje post i indata till undertabeller (ordningen bevaras).
  2. Tillämpar underfrågan för var och en av undertabellerna.
  3. Lägger till noll eller fler kolumner i den resulterande undertabellen. Dessa kolumner innehåller värdena för de källkolumner som inte expanderas och upprepas där det behövs.
  4. Returnerar resultatets union.

Operatorn mv-apply hämtar följande indata:

  1. Ett eller flera uttryck som utvärderas till dynamiska matriser för att expandera. Antalet poster i varje expanderad undertabell är den maximala längden för var och en av dessa dynamiska matriser. Null-värden läggs till där flera uttryck anges och motsvarande matriser har olika längd.

  2. Du kan också tilldela namnen för att tilldela värdena för uttrycken efter expansionen. Dessa namn blir kolumnnamnen i undertabellerna. Om det inte anges används det ursprungliga namnet på kolumnen när uttrycket är en kolumnreferens. Ett slumpmässigt namn används annars.

    Not

    Vi rekommenderar att du använder standardkolumnnamnen.

  3. Datatyperna för elementen i dessa dynamiska matriser efter expansionen. Dessa blir kolumntyperna för kolumnerna i undertabellerna. Om det inte anges används dynamic.

  4. Alternativt kan namnet på en kolumn som ska läggas till i undertabellerna som anger det 0-baserade indexet för elementet i matrisen som resulterade i den undertabellpost.

  5. Du kan också utöka det maximala antalet matriselement.

Den mv-apply operatorn kan betraktas som en generalisering av mv-expand-operatorn (i själva verket kan den senare implementeras av den förra, om underfrågan endast innehåller projektioner.)

Syntax

T|mv-apply [ItemIndex] ColumnsToExpand [RowLimit] on(SubQuery)

Där ItemIndex har syntaxen:

with_itemindex = IndexColumnName

ColumnsToExpand är en kommaavgränsad lista över ett eller flera element i formuläret:

[Name=] ArrayExpression [totypeof(Typename)]

RowLimit är helt enkelt:

limit RowLimit

och SubQuery har samma syntax för alla frågeuttryck.

Läs mer om syntaxkonventioner.

Parametrar

Namn Typ Krävs Beskrivning
ItemIndex string Anger namnet på en kolumn av typen long som läggs till i indata som en del av matrisexpansionsfasen och anger det 0-baserade matrisindexet för det expanderade värdet.
namn string Namnet för att tilldela matris expanderade värden för varje matrisut expanderat uttryck. Om det inte anges används namnet på kolumnen om det är tillgängligt. Ett slumpmässigt namn genereras om ArrayExpression inte är ett enkelt kolumnnamn.
ArrayExpression dynamic ✔️ Matrisen vars värden är matris-expanderade. Om uttrycket är namnet på en kolumn i indata tas indatakolumnen bort från indata och en ny kolumn med samma namn, eller ColumnName- om det anges, visas i utdata.
Typename string Namnet på den typ som de enskilda elementen i den dynamic matrisen ArrayExpression ta. Element som inte överensstämmer med den här typen ersätts med ett null-värde. Om det är ospecificerat används dynamic som standard.
RowLimit int En gräns för hur många poster som ska genereras från varje post i indata. Om det är ospecificerat används 2147483647.
SubQuery string Ett tabellfrågeuttryck med en implicit tabellkälla som tillämpas på varje matris expanderad undertabell.

Not

Till skillnad från operatorn mv-expand stöder mv-apply-operatorn inte bagexpand=array expansion. Om uttrycket som ska expanderas är en egenskapsuppsättning och inte en matris kan du använda en inre mv-expand operator (se exemplet nedan).

Exempel

Granska exemplen och kör dem på datautforskarens frågesida.

Hämta det största elementet från matrisen

Frågan matar ut det minsta jämna talet (2) och det minsta udda talet (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
    )

utdata

xMod2 l element
1 [1, 3, 5, 7] 7
0 [2, 4, 6, 8] 8

Beräkna summan av de två största elementen i en matris

Frågan matar ut summan av de översta 2 jämna talen (6 + 8 = 14) och summan av de 2 främsta udda talen (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)
    )

utdata

xMod2 l SumOfTop2
1 [1,3,5,7] 12
0 [2,4,6,8] 14

Välj element i matriser

Frågan identifierar de 2 översta elementen från varje dynamisk matris baserat på Arr2-värdena och sammanfattar dem i nya listor.

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)
)

utdata

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]

Använda with_itemindex för att arbeta med en delmängd av matrisen

Frågan resulterar i en tabell med rader där indexet är 3 eller högre, inklusive index- och elementvärdena från de ursprungliga listorna med jämna och udda tal.

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

utdata

index element
3 7
4 9
3 8
4 10

Använda mutiple-kolumner för att koppla element i 2 matriser

Frågan kombinerar element från två dynamiska matriser till ett nytt sammanfogat format och sammanfattar dem sedan i listor.

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)
    )

utdata

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

Tillämpa mv-apply på en egenskapsväska

Den här frågan tar dynamiskt bort egenskaper från objektet med packade värden baserat på villkoret att deras värden inte börjar med "555". Slutresultatet innehåller de ursprungliga kolumnerna med oönskade egenskaper borttagna.

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

utdata

SourceNumber TargetNumber CharsCount värden
555-555-1234 555-555-1212 46 {
"SourceNumber": "555-555-1234",
"TargetNumber": "555-555-1212"
}
555-555-1212     {
"SourceNumber": "555-555-1212"
}