Freigeben über


mv-apply-Operator

Gilt für: ✅Microsoft Fabric

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 Datentypen werden zu den Spaltentypen 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 [totypeof(Typename])

RowLimit ist einfach:

limit RowLimit

SubQuery weist dieselbe Syntax einer abfrage-Anweisung auf.

Erfahren Sie mehr über Syntaxkonventionen.

Parameter

Name Typ 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.
Typename 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 mv-apply der bagexpand=array 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 das folgende Beispiel).

Beispiele

Überprüfen Sie die Beispiele, und führen Sie sie auf der Abfrageseite des Daten-Explorers aus.

Abrufen des größten Elements aus dem Array

Die Abfrage gibt die kleinste gerade Zahl (2) und die kleinste ungerade Zahl (1) aus.

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 Liter Element
1 [1, 3, 5, 7] 7
0 [2, 4, 6, 8] 8

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

Die Abfrage gibt die Summe der obersten beiden geraden Zahlen (6 + 8 = 14) und die Summe der beiden obersten ungeraden Zahlen (5 + 7 = 12) aus.

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 Liter SummeOfTop2
1 [1,3,5,7] 12
0 [2,4,6,8] 14

Auswählen von Elementen in Arrays

Die Abfrage identifiziert die beiden wichtigsten Elemente aus jedem dynamischen Array basierend auf den Arr2-Werten und fasst sie in neue Listen zusammen.

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 with_itemindex für die Arbeit mit einer Teilmenge des Arrays

Die Abfrage führt zu einer Tabelle mit Zeilen, in denen der Index 3 oder höher ist, einschließlich der Index- und Elementwerte aus den ursprünglichen Listen mit geraden und ungeraden Zahlen.

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 mehrerer Spalten zum Verbinden von Elementen zweier Arrays

Die Abfrage kombiniert Elemente aus zwei dynamischen Arrays in einem neuen verketteten Format und fasst sie dann in Listen zusammen.

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

Diese Abfrage entfernt eigenschaften dynamisch aus dem gepackten Werteobjekt basierend auf den Kriterien, die ihre Werte nicht mit 555 beginnen. Das Endergebnis enthält die ursprünglichen Spalten mit entfernten unerwünschten Eigenschaften.

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