Dela via


mv-apply-operatorn

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 flera 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. Alternativt kan namnen som ska tilldelas värdena för uttrycken efter expansionen. Dessa namn blir kolumnnamnen i undertabellerna. Om inget anges används det ursprungliga namnet på kolumnen när uttrycket är en kolumnreferens. Ett slumpmässigt namn används annars.

    Anteckning

    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 dynamic används.

  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. Alternativt kan det maximala antalet matriselement som ska expanderas.

Operatorn mv-apply kan betraktas som en generalisering av operatorn mv-expand (i själva verket kan den senare implementeras av den förstnämnda, 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:

[Namn=] ArrayExpression [totypeof(Typename)]

RowLimit är helt enkelt:

limitRowLimit

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

Läs mer om syntaxkonventioner.

Parametrar

Namn Typ Obligatorisk 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 matris expanderat uttryck. Om inget 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 den anges, visas i utdata.
Typename string Namnet på den typ som de enskilda elementen i matrisen dynamicArrayExpression tar. Element som inte överensstämmer med den här typen ersätts med ett null-värde. Om det är ospecificerat dynamic används 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.
Underfråga string Ett tabellfrågeuttryck med en implicit tabellkälla som tillämpas på varje matris expanderad undertabell.

Anteckning

Till skillnad från operatorn mv-expand stöder bagexpand=array operatorn mv-apply inte 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

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

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
    )

Resultat

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

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

Resultat

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

Välj element i matriser

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

Resultat

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

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

Resultat

index element
3 7
4 9
3 8
4 10

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

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

Resultat

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 egenskapsuppsättning

I följande exempel mv-apply används i kombination med ett inre mv-expand för att ta bort värden som inte börjar med "555" från en egenskapsuppsättning:

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

Resultat

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