Megosztás a következőn keresztül:


mv-apply operátor

Minden rekordra alkalmaz egy-egy al lekérdezést, és visszaadja az összes albekérdezés eredményének egyesítését.

Tegyük fel például, hogy egy tábla T olyan típusú dynamic oszlopot Metric tartalmaz, amelynek értékei számok tömbjeireal. Az alábbi lekérdezés megkeresi az egyes Metric értékek két legnagyobb értékét, és visszaadja az ezeknek az értékeknek megfelelő rekordokat.

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

Az mv-apply operátor a következő feldolgozási lépésekkel rendelkezik:

  1. Az operátor használatával mv-expand a bemenet minden rekordját altáblákká bontja (a sorrend megmarad).
  2. Az altáblákra alkalmazza az al lekérdezéseket.
  3. Nulla vagy több oszlopot ad hozzá az eredményként kapott altáblához. Ezek az oszlopok a nem kibontott forrásoszlopok értékeit tartalmazzák, és szükség esetén ismétlődnek.
  4. Az eredmények egyesítését adja vissza.

Az mv-apply operátor a következő bemeneteket kapja:

  1. Egy vagy több kifejezés, amely dinamikus tömbökké bontható ki. Az egyes kibontott altáblák rekordjainak száma az egyes dinamikus tömbök maximális hossza. Null értékeket ad hozzá, ahol több kifejezés van megadva, és a megfelelő tömbök eltérő hosszúságúak.

  2. Opcionálisan a kifejezések értékeinek kiosztásához szükséges nevek a bővítés után. Ezek a nevek lesznek az altáblák oszlopnevei. Ha nincs megadva, a rendszer az oszlop eredeti nevét használja, ha a kifejezés egy oszlophivatkozás. Ellenkező esetben véletlenszerű nevet használunk.

    Megjegyzés

    Ajánlott az alapértelmezett oszlopneveket használni.

  3. A dinamikus tömbök elemeinek adattípusai a bővítés után. Ezek lesznek az altáblák oszloptípusai. Ha nincs megadva, dynamic akkor a rendszer használja.

  4. Opcionálisan az altáblákhoz hozzáadni kívánt oszlop neve, amely megadja a tömb azon elemének 0-alapú indexét, amely az altáblarekordot eredményezte.

  5. Igény szerint a kibontandó tömbelemek maximális száma.

Az mv-apply operátort az mv-expand operátor általánosításának tekinthetjük (ez utóbbit az előbbi implementálhatja, ha az al lekérdezés csak előrejelzéseket tartalmaz.)

Syntax

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

Ahol az ItemIndex szintaxisa van:

with_itemindex=IndexColumnName

A ColumnsToExpand az űrlap egy vagy több elemének vesszővel tagolt listája:

[Név=] ArrayExpression [totypeof(Typename)]

A RowLimit egyszerűen:

limitRowLimit

és a SubQuery bármely lekérdezési utasításnak ugyanaz a szintaxisa.

További információ a szintaxis konvenciókról.

Paraméterek

Név Típus Kötelező Leírás
ItemIndex string Egy olyan típusú long oszlop nevét jelzi, amely a tömbbővítési fázis részeként hozzá van fűzve a bemenethez, és a kibontott érték 0-alapú tömbindexét jelzi.
Név string Az egyes tömbbővített kifejezések tömbbővített értékeinek hozzárendeléséhez használni kívánt név. Ha nincs megadva, a rendszer az oszlop nevét használja, ha elérhető. Véletlenszerű név jön létre, ha az ArrayExpression nem egyszerű oszlopnév.
ArrayExpression dynamic ✔️ Az a tömb, amelynek értékei tömbbővítettek. Ha a kifejezés a bemenet egyik oszlopának a neve, a bemeneti oszlop el lesz távolítva a bemenetből, és a kimenetben megjelenik egy új, azonos nevű oszlop( vagy ha meg van adva a ColumnName ).
Típusnév string Annak a típusnak a neve, amelyet a dynamicTömbExpression tömb egyes elemei figyelembe vesznek. Az ilyen típusú elemeket null érték váltja fel. Ha nincs meghatározva, dynamic alapértelmezés szerint a rendszer használja.
RowLimit int A bemenet egyes rekordjaiból létrehozandó rekordok számának korlátja. Ha nincs meghatározva, 2147483647 lesz használva.
Allekérdezés string Táblázatos lekérdezési kifejezés implicit táblázatos forrással, amely minden tömbtel kibontott altáblára alkalmazva lesz.

Megjegyzés

mv-expand Az operátortól eltérően az operátor nem támogatja bagexpand=array a mv-apply bővítést. Ha a kibontandó kifejezés nem tömb, hanem tulajdonságcsomag, használhat belső mv-expand operátort (lásd az alábbi példát).

Példák

A legnagyobb elem lekérése a tömbből

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
    )

Kimenet

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

A tömb két legnagyobb elemének összegének kiszámítása

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

Kimenet

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

Elemek kijelölése tömbökben

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

Kimenet

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]

A tömb with_itemindex egy részhalmazának használata

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

Kimenet

index Elem
3 7
4 9
3 8
4 10

Mutiple-oszlopok használata 2 tömb elemeinek összekapcsolásához

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

Kimenet

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 alkalmazása tulajdonságcsomagra

Az alábbi példában mv-apply egy belsővel mv-expand kombinálva eltávolítjuk az "555" karakterrel nem kezdődő értékeket egy tulajdonságzsákból:

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

Kimenet

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