Freigeben über


mv-apply-Operator

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

Angenommen, eine Tabelle T weist eine Spalte Metric vom Typ dynamic auf, 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 nicht erweiterten Quellspalten und werden bei Bedarf wiederholt.
  4. Gibt die Vereinigung der Ergebnisse zurück.

Der mv-apply Operator ruft die folgenden Eingaben ab:

  1. Mindestens ein Ausdruck, der zu dynamischen Arrays ausgewertet wird, um zu erweitern. Die Anzahl der Datensätze in jeder erweiterten Untertabelle ist die maximale Länge der einzelnen dynamischen Arrays. Nullwerte werden hinzugefügt, wenn mehrere Ausdrücke angegeben werden und die entsprechenden Arrays unterschiedliche Längen aufweisen.

  2. Optional weisen die Namen die Werte der Ausdrücke nach der Erweiterung zu. 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 der Spalten in den Untertabellen. Wenn dieser nicht angegeben wurde, wird dynamic verwendet.

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

  5. Optional kann die maximale Anzahl von Arrayelementen erweitert werden.

Der mv-apply Operator kann als Verallgemeinerung des mv-expand Operators betrachtet werden (in der Tat kann letzteres vom früheren implementiert werden, wenn die Unterabfrage nur Projektionen enthält.)

Syntax

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

Dabei weist ItemIndex die Syntax auf:

with_itemindex= IndexColumnName

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

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

RowLimit ist einfach:

limitRowLimit

und SubQuery weist dieselbe Syntax jeder Abfrage-Anweisung auf.

Erfahren Sie mehr über Syntaxkonventionen.

Parameter

Name Type Erforderlich Beschreibung
ItemIndex string Gibt den Namen einer Spalte vom Typ long an, die als Teil 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 array-erweiterten Ausdrucks. Wenn nicht angegeben, wird der Name der Spalte verwendet, falls verfügbar. Ein zufälliger Name wird generiert, wenn ArrayExpression kein einfacher Spaltenname ist.
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 eine neue Spalte mit demselben Namen oder ColumnName (sofern angegeben) wird in der Ausgabe angezeigt.
Typname string Der Name des Typs, den die einzelnen Elemente des dynamic Array ArrayExpression übernehmen. Elemente, die diesem Typ nicht entsprechen, werden durch einen Nullwert 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.
SubQuery string Ein Tabellarischer Abfrageausdruck mit einer impliziten tabellarischen Quelle, die auf jede Array-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
    )

Output

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

Output

xMod2 l SummeOfTop2
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)
)

Output

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 with_itemindex für die Arbeit 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

Output

Index Element
3 7
4 9
3 8
4 10

Verwenden von Mutiplespalten zum Verbinden von Elementen mit 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)
    )

Output

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" aus einem Eigenschaftenbehälter beginnen:

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

Output

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