Sdílet prostřednictvím


Operátor mv-apply

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

Použije poddotaz na každý záznam a vrátí sjednocení výsledků všech poddotazů.

Předpokládejme například, že tabulka T obsahuje sloupec Metric typu dynamic , jehož hodnoty jsou matice čísel real . Následující dotaz vyhledá dvě největší hodnoty v každé Metric hodnotě a vrátí záznamy odpovídající těmto hodnotám.

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

Operátor mv-apply má následující kroky zpracování:

  1. Pomocí operátoru mv-expand rozbalí každý záznam ve vstupu do dílčích tabulek (pořadí se zachová).
  2. Použije poddotaz pro každou z dílčích tabulek.
  3. Přidá do výsledné podtable nuly nebo více sloupců. Tyto sloupce obsahují hodnoty zdrojových sloupců, které nejsou rozbalené, a v případě potřeby se opakují.
  4. Vrátí sjednocení výsledků.

Operátor mv-apply získá následující vstupy:

  1. Jeden nebo více výrazů, které se vyhodnocují do dynamických polí, které se mají rozšířit. Počet záznamů v každé rozbalené podtable je maximální délka každého z těchto dynamických polí. Hodnoty null se přidají tam, kde je zadáno více výrazů a odpovídající pole mají různé délky.

  2. Volitelně můžete názvy, které se mají přiřadit hodnoty výrazů po rozbalení. Tyto názvy se stanou názvy sloupců v podtables. Pokud není zadaný, použije se původní název sloupce, pokud je výraz odkazem na sloupec. V opačném případě se použije náhodný název.

    Poznámka:

    Doporučujeme použít výchozí názvy sloupců.

  3. Datové typy prvků těchto dynamických polí po rozšíření. Z těchto sloupců se stanou typy sloupců v podtables. Pokud není zadáno, dynamic použije se.

  4. Volitelně můžete název sloupce přidat do podřízených tabulek, který určuje index založený na 0 prvku v poli, který způsobil záznam podtable.

  5. Volitelně můžete rozbalit maximální počet prvků pole.

Operátor mv-apply lze považovat za zobecnění operátoru mv-expand (ve skutečnosti může být implementováno dřívějším operátorem, pokud poddotaz zahrnuje pouze projekce.)

Syntaxe

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

Kde ItemIndex má syntaxi:

with_itemindex= IndexColumnName

ColumnsToExpand je čárkami oddělený seznam jednoho nebo více prvků formuláře:

[Name] ArrayExpression [to (typeof Typename] =)

RowLimit je jednoduše:

limitRowLimit

a SubQuery mají stejnou syntaxi jako všechny příkazy dotazu.

Přečtěte si další informace o konvencích syntaxe.

Parametry

Název Type Požadováno Popis
ItemIndex string Označuje název sloupce typu long , který je připojen ke vstupu jako součást fáze rozšíření pole a označuje 0-based index matice rozšířené hodnoty.
Název string Název pro přiřazení hodnot rozbalených matici každého výrazu s rozbaleným polem. Pokud není zadaný, použije se název sloupce, pokud je k dispozici. Náhodný název se vygeneruje, pokud ArrayExpression není jednoduchý název sloupce.
ArrayExpression dynamic ✔️ Jedná se o matici, jejíž hodnoty jsou rozbalené. Pokud je výrazem název sloupce ve vstupu, vstupní sloupec se ze vstupu odebere a ve výstupu se zobrazí nový sloupec se stejným názvem nebo sloupec ColumnName ( pokud je zadaný).
Název typu string Název typu, který jednotlivé prvky dynamic pole ArrayExpression vezme. Prvky, které nevyhovují tomuto typu, se nahradí hodnotou null. Pokud není zadaný, dynamic použije se ve výchozím nastavení.
RowLimit int Limit počtu záznamů, které se mají vygenerovat z každého záznamu vstupu. Pokud není zadaný, použije se 2147483647.
Poddotaz string Výraz tabulkového dotazu s implicitní tabulkovým zdrojem, který se použije pro každou podtable rozbalenou maticí.

Poznámka:

Na rozdíl od operátoru mv-expand mv-apply operátor nepodporuje bagexpand=array rozšíření. Pokud výraz, který se má rozšířit, je taška vlastností, nikoli pole, můžete použít vnitřní mv-expand operátor (viz příklad níže).

Příklady

Získání největšího prvku z pole

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
    )

Výstup

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

Výpočet součtu největších dvou prvků v matici

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

Výstup

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

Výběr prvků v polích

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

Výstup

Val1 Arr1 Arr2 NewArr1 NewArr2
0 ["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]

Použití with_itemindex pro práci s podmnožinou pole

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

Výstup

index – element
3 7
4 9
3 8
4 10

Použití ztlumených sloupců ke spojení prvku se 2 poli

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

Výstup

Val Arr1 Arr2 Out
0 ["A1","A2","A3"] ["B1","B2","B3"] ["A1_B1","A2_B2","A3_B3"]
5 ["C1","C2"] ["D1","D2"] ["C1_D1","C2_D2"]

Použití mv-apply na tašku vlastností

V následujícím příkladu se používá v kombinaci s vnitřní mv-expand odebráním hodnot, mv-apply které nezačíná na 555 z tašky vlastností:

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

Výstup

SourceNumber Cílové číslo CharsCount hodnoty
555-555-1234 555-555-1212 46 {
"SourceNumber": "555-555-1234",
"TargetNumber": "555-555-1212"
}
555-555-1212     {
"SourceNumber": "555-555-1212"
}