operator mv-apply

Past een subquery toe op elke record en retourneert de samenvoeging van de resultaten van alle subquery's.

Stel dat een tabel T een kolom Metric van het type dynamic heeft waarvan de waarden matrices van real getallen zijn. De volgende query zoekt de twee grootste waarden in elke Metric waarde en retourneert de records die overeenkomen met deze waarden.

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

De mv-apply operator heeft de volgende verwerkingsstappen:

  1. Hiermee wordt de mv-expand operator gebruikt om elke record in de invoer uit te breiden naar subtabellen (volgorde blijft behouden).
  2. Past de subquery toe op elk van de subtabellen.
  3. Hiermee voegt u nul of meer kolommen toe aan de resulterende subtabel. Deze kolommen bevatten de waarden van de bronkolommen die niet zijn uitgevouwen en waar nodig worden herhaald.
  4. Retourneert de samenvoeging van de resultaten.

De mv-apply operator krijgt de volgende invoer:

  1. Een of meer expressies die resulteren in dynamische matrices om uit te vouwen. Het aantal records in elke uitgevouwen subtabel is de maximale lengte van elk van deze dynamische matrices. Null-waarden worden toegevoegd wanneer meerdere expressies zijn opgegeven en de bijbehorende matrices verschillende lengten hebben.

  2. Optioneel de namen om de waarden van de expressies toe te wijzen na uitbreiding. Deze namen worden de kolomnamen in de subtabellen. Als dit niet is opgegeven, wordt de oorspronkelijke naam van de kolom gebruikt wanneer de expressie een kolomreferentie is. Anders wordt een willekeurige naam gebruikt.

    Notitie

    Het wordt aanbevolen om de standaardkolomnamen te gebruiken.

  3. De gegevenstypen van de elementen van deze dynamische matrices, na uitbreiding. Dit worden de kolomtypen van de kolommen in de subtabellen. Indien niet opgegeven, dynamic wordt gebruikt.

  4. Optioneel de naam van een kolom die moet worden toegevoegd aan de subtabellen die de op 0 gebaseerde index aangeeft van het element in de matrix die heeft geresulteerd in de subtabelrecord.

  5. Optioneel, het maximum aantal matrixelementen dat u wilt uitvouwen.

De mv-apply operator kan worden gezien als een generalisatie van de mv-expand operator (in feite kan de laatste worden geïmplementeerd door de eerste, als de subquery alleen projecties bevat.)

Syntax

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

Waarbij ItemIndex de syntaxis heeft:

with_itemindex=IndexColumnName

ColumnsToExpand is een door komma's gescheiden lijst met een of meer elementen van het formulier:

[Naam=] MatrixExpression [totypeof(Typename)]

RowLimit is simpelweg:

limitRijscheidingsteken

en SubQuery heeft dezelfde syntaxis als elke query-instructie.

Meer informatie over syntaxisconventies.

Parameters

Naam Type Vereist Beschrijving
ItemIndex string Geeft de naam aan van een kolom van het type long die aan de invoer wordt toegevoegd als onderdeel van de matrixuitbreidingsfase en geeft de matrixindex op basis van 0 van de uitgevouwen waarde aan.
Naam string De naam voor het toewijzen van de matrix-uitgevouwen waarden van elke matrix-uitgevouwen expressie. Als dit niet is opgegeven, wordt de naam van de kolom gebruikt, indien beschikbaar. Er wordt een willekeurige naam gegenereerd als ArrayExpression geen eenvoudige kolomnaam is.
MatrixExpression dynamic ✔️ De matrix waarvan de waarden matrix-uitgevouwen zijn. Als de expressie de naam is van een kolom in de invoer, wordt de invoerkolom verwijderd uit de invoer en wordt een nieuwe kolom met dezelfde naam of ColumnName , indien opgegeven, weergegeven in de uitvoer.
Typename string De naam van het type dat door de afzonderlijke elementen van de dynamic matrix MatrixExpression wordt gebruikt. Elementen die niet aan dit type voldoen, worden vervangen door een null-waarde. Indien niet opgegeven, dynamic wordt standaard gebruikt.
Rijscheidingsteken int Een limiet voor het aantal records dat moet worden gegenereerd op basis van elke record van de invoer. Als dit niet wordt opgegeven, wordt 2147483647 gebruikt.
Subquery string Een tabellaire queryexpressie met een impliciete tabellaire bron die wordt toegepast op elke uit een matrix uitgevouwen subtabel.

Notitie

In tegenstelling tot de mv-expand operator biedt de mv-apply operator geen ondersteuning voor bagexpand=array uitbreiding. Als de uit te breiden expressie een eigenschappenverzameling is en geen matrix, kunt u een inner mv-expand operator gebruiken (zie het onderstaande voorbeeld).

Voorbeelden

Het grootste element uit de matrix ophalen

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
    )

Uitvoer

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

De som van de twee grootste elementen in een matrix berekenen

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

Uitvoer

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

Elementen in matrices selecteren

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

Uitvoer

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]

Gebruiken with_itemindex voor het werken met een subset van de matrix

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

Uitvoer

index Element
3 7
4 9
3 8
4 10

Meerdere kolommen gebruiken om het element van 2 matrices samen te voegen

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

Uitvoer

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 toepassen op een eigenschappenverzameling

In het volgende voorbeeld mv-apply wordt gebruikt in combinatie met een binnenste mv-expand om waarden te verwijderen die niet beginnen met '555' uit een eigenschappenverzameling:

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

Uitvoer

SourceNumber TargetNumber Aantal tekens values
555-555-1234 555-555-1212 46 {
"SourceNumber": "555-555-1234",
"TargetNumber": "555-555-1212"
}
555-555-1212     {
"SourceNumber": "555-555-1212"
}