mv-apply-Operator
Gilt für: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
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:
- Verwendet den
mv-expand
Operator, um jeden Datensatz in der Eingabe in Untertabellen zu erweitern (Reihenfolge wird beibehalten). - Wendet die Unterabfrage für jede der Untertabellen an.
- Fügt der resultierenden Untertabelle null oder mehr Spalten hinzu. Diese Spalten enthalten die Werte der nicht erweiterten Quellspalten und werden bei Bedarf wiederholt.
- Gibt die Vereinigung der Ergebnisse zurück.
Der mv-apply
Operator ruft die folgenden Eingaben ab:
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.
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.
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.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.
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:
limit
RowLimit
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" } |