Share via


mv-apply-Operator

Wendet eine Unterabfrage auf jeden Datensatz an und gibt die Union der Ergebnisse aller Unterabfragen zurück.

Angenommen, eine Tabelle T verfügt über eine Spalte Metric vom Typ dynamic , deren Werte Arrays von real Zahlen sind. Die folgende Abfrage sucht die beiden größten Werte in jedem Metric Wert und gibt die Datensätze zurück, die diesen Werten entsprechen.

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

Der mv-apply Operator verfügt über die folgenden Verarbeitungsschritte:

  1. Verwendet den mv-expand -Operator, um jeden Datensatz in der Eingabe in Untertabellen zu erweitern (Reihenfolge wird beibehalten).
  2. Wendet die Unterabfrage für jede der Untertabellen an.
  3. Fügt der resultierenden Untertabelle null oder mehr Spalten hinzu. Diese Spalten enthalten die Werte der Quellspalten, die nicht erweitert und bei Bedarf wiederholt werden.
  4. Gibt die Union der Ergebnisse zurück.

Der mv-apply Operator ruft die folgenden Eingaben ab:

  1. Ein oder mehrere Ausdrücke, die zu dynamischen Arrays ausgewertet werden, um sie zu erweitern. Die Anzahl der Datensätze in jeder erweiterten Untertabelle ist die maximale Länge jedes dieser dynamischen Arrays. Null-Werte werden hinzugefügt, wenn mehrere Ausdrücke angegeben werden und die entsprechenden Arrays unterschiedliche Längen aufweisen.

  2. Optional die Namen, die nach der Erweiterung die Werte der Ausdrücke zuweisen sollen. Diese Namen werden zu den Spaltennamen in den Untertabellen. Wenn nicht angegeben, wird der ursprüngliche Name der Spalte verwendet, wenn der Ausdruck ein Spaltenverweis ist. Andernfalls wird ein zufälliger Name verwendet.

    Hinweis

    Es wird empfohlen, die Standardspaltennamen zu verwenden.

  3. Die Datentypen der Elemente dieser dynamischen Arrays nach der Erweiterung. Diese werden zu den Spaltentypen in den Untertabellen. Wenn dieser nicht angegeben wurde, wird dynamic verwendet.

  4. Optional der Name einer Spalte, die den Untertabellen hinzugefügt werden soll, die den 0-basierten Index des Elements im Array angibt, das zu dem untergeordneten Datensatz geführt hat.

  5. Optional die maximale Anzahl von Arrayelementen, die erweitert werden sollen.

Der mv-apply Operator kann als eine Generalisierung des mv-expand Operators betrachtet werden (in der Tat kann letzterer vom ersteren implementiert werden, wenn die Unterabfrage nur Projektionen enthält.)

Syntax

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

Wobei ItemIndex die Syntax hat:

with_itemindex=IndexColumnName

ColumnsToExpand ist eine durch Trennzeichen getrennte Liste eines oder mehrerer Elemente des Formulars:

[Name=] ArrayExpression [totypeof(Typename)]

RowLimit ist einfach:

limitRowLimit

und SubQuery weist die gleiche Syntax wie jede Abfrageanweisung auf.

Erfahren Sie mehr über Syntaxkonventionen.

Parameter

Name Typ Erforderlich BESCHREIBUNG
Itemindex string Gibt den Namen einer Spalte vom Typ long an, die im Rahmen der Arrayerweiterungsphase an die Eingabe angefügt wird, und gibt den 0-basierten Arrayindex des erweiterten Werts an.
Name string Der Name zum Zuweisen der Array-erweiterten Werte jedes arrayer erweiterten Ausdrucks. Wenn nicht angegeben, wird der Name der Spalte verwendet, sofern verfügbar. Wenn ArrayExpression kein einfacher Spaltenname ist, wird ein zufälliger Name generiert.
ArrayExpression dynamic ✔️ Das Array, dessen Werte array-erweitert sind. Wenn der Ausdruck der Name einer Spalte in der Eingabe ist, wird die Eingabespalte aus der Eingabe entfernt, und in der Ausgabe wird eine neue Spalte mit demselben Namen oder ColumnName angezeigt, falls angegeben.
Typename string Der Name des Typs, den die einzelnen Elemente des dynamicArrays ArrayExpression verwenden. Elemente, die diesem Typ nicht entsprechen, werden durch einen NULL-Wert ersetzt. Wenn nicht angegeben, dynamic wird standardmäßig verwendet.
RowLimit int Ein Grenzwert für die Anzahl der Datensätze, die aus jedem Datensatz der Eingabe generiert werden sollen. Wenn nicht angegeben, wird 2147483647 verwendet.
Unterabfrage string Ein tabellarischer Abfrageausdruck mit einer impliziten tabellarischen Quelle, die auf jede durch Arrays erweiterte Untertabelle angewendet wird.

Hinweis

mv-expand Im Gegensatz zum Operator unterstützt bagexpand=array der mv-apply Operator keine Erweiterung. Wenn der zu erweiternde Ausdruck ein Eigenschaftenbehälter und kein Array ist, können Sie einen inneren mv-expand Operator verwenden (siehe Beispiel unten).

Beispiele

Abrufen des größten Elements aus dem Array

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
    )

Ausgabe

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

Berechnen der Summe der größten beiden Elemente in einem Array

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

Ausgabe

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

Auswählen von Elementen in Arrays

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

Ausgabe

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]

Verwenden von with_itemindex zum Arbeiten mit einer Teilmenge des Arrays

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

Ausgabe

Index element
3 7
4 9
3 8
4 10

Verwenden von Mutiplespalten zum Verbinden eines Elements von 2 Arrays

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

Ausgabe

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

Anwenden von mv-apply auf einen Eigenschaftenbehälter

Im folgenden Beispiel wird in Kombination mit einem inneren mv-expand verwendet, um Werte zu entfernen, mv-apply die nicht mit "555" beginnen, aus einem Eigenschaftenbehälter:

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

Ausgabe

SourceNumber TargetNumber CharsCount Werte
555-555-1234 555-555-1212 46 {
"SourceNumber": "555-555-1234",
"TargetNumber": "555-555-1212"
}
555-555-1212     {
"SourceNumber": "555-555-1212"
}