innerunique join

Die innerunique Verknüpfungsvariante entfernt doppelte Schlüssel von der linken Seite. Dieses Verhalten stellt sicher, dass die Ausgabe eine Zeile für jede Kombination von eindeutigen linken und rechten Tasten enthält.

Standardmäßig wird die Verknüpfungsvariante innerunique verwendet, wenn der kind Parameter nicht angegeben wird. Diese Standardimplementierung ist in Protokoll-/Ablaufverfolgungsanalyseszenarien nützlich, in denen Sie zwei Ereignisse basierend auf einer freigegebenen Korrelations-ID korrelieren möchten. Es ermöglicht Ihnen, alle Instanzen des Phänomens abzurufen, ohne doppelte Ablaufverfolgungsdatensätze zu ignorieren, die zur Korrelation beitragen.

Diagramm, das zeigt, wie die Verknüpfung funktioniert.

Syntax

LeftTable|joinkind=innerunique [ Hinweise ] RightTableonBedingungen

Erfahren Sie mehr über Syntaxkonventionen.

Parameter

Name Typ Erforderlich BESCHREIBUNG
LeftTable string ✔️ Die linke Tabelle oder der tabellarischen Ausdruck, die bzw. der manchmal als äußere Tabelle bezeichnet wird, deren Zeilen zusammengeführt werden sollen. Wird als $left bezeichnet.
Hinweise string Null oder mehr durch Leerzeichen getrennte Join-Hinweise in Form von Name=Wert, die das Verhalten des Vorgangs zum Zuordnen der Zeilen und den Ausführungsplan steuern. Weitere Informationen finden Sie unter Hinweise.
RightTable string ✔️ Die rechte Tabelle oder der tabellarische Ausdruck, die bzw. der manchmal als innere Tabelle bezeichnet werden, deren Zeilen zusammengeführt werden sollen. Wird als $right bezeichnet.
Conditions (MSBuild-Bedingungen) string ✔️ Bestimmt, wie Zeilen aus LeftTable mit Zeilen aus RightTable abgeglichen werden. Wenn die Spalten, die Sie abgleichen möchten, in beiden Tabellen denselben Namen haben, verwenden Sie die Syntax ONColumnName. Verwenden Sie andernfalls die Syntax ON $left.LeftColumn==$right.RightColumn. Um mehrere Bedingungen anzugeben, können Sie entweder das Schlüsselwort „and“ verwenden oder sie durch Kommas trennen. Wenn Sie Kommas verwenden, werden die Bedingungen mit dem logischen Operator „and“ ausgewertet.

Tipp

Wenn eine Tabelle immer kleiner als die andere ist, verwenden Sie diese für die bestmögliche Leistung als die linke Seite des Join.

Hinweise

Parametername Werte Beschreibung
hint.remote auto, left, local, right Siehe clusterübergreifender Join
hint.strategy=broadcast Gibt die Art und Weise an, in der die Abfragelast auf Clusterknoten verteilt wird. Siehe Broadcast-Join
hint.shufflekey=<key> Die shufflekey-Abfrage teilt die Abfragelast auf Clusterknoten auf, wobei ein Schlüssel zum Partitionieren der Daten verwendet wird. Weitere Informationen finden Sie unter Shuffleabfrage
hint.strategy=shuffle Die shuffle-Strategieabfrage teilt die Abfragelast auf Clusterknoten auf, wobei jeder Knoten eine Partition der Daten verarbeitet. Weitere Informationen finden Sie unter Shuffleabfrage

Gibt zurück

Schema: Alle Spalten aus beiden Tabellen, einschließlich der übereinstimmenden Schlüssel.
Zeilen: Alle deduplizierten Zeilen aus der linken Tabelle, die mit Zeilen aus der rechten Tabelle übereinstimmen.

Beispiele

Verwenden des standardmäßigen innerunique-Joins

let X = datatable(Key:string, Value1:long)
[
    'a',1,
    'b',2,
    'b',3,
    'c',4
];
let Y = datatable(Key:string, Value2:long)
[
    'b',10,
    'c',20,
    'c',30,
    'd',40
];
X | join Y on Key

Ausgabe

Schlüssel Wert1 Key1 Wert2
b 2 b 10
c 4 c 20
c 4 c 30

Hinweis

Die Schlüssel „a“ und „d“ werden nicht in der Ausgabe angezeigt, da es keine übereinstimmenden Schlüssel links und rechts gab.

Die Abfrage hat den Standardbeitritt ausgeführt, bei dem es sich um einen inneren Join handelt, nachdem die linke Seite basierend auf dem Joinschlüssel dedupliziert wurde. Die Deduplizierung behält nur den ersten Datensatz bei. Die resultierende linke Seite der Verknüpfung nach der Deduplizierung lautet:

Schlüssel Wert1
a 1
b 2
c 4

Zwei mögliche Ausgaben von innerunique join

Hinweis

Die innerunique Verknüpfungsvariante kann zwei mögliche Ausgaben ergeben, und beide sind richtig. In der ersten Ausgabe hat der join-Operator den ersten Schlüssel, der in t1 mit dem Wert „val1.1“ vorhanden ist, nach dem Zufallsprinzip ausgewählt und mit t2-Schlüsseln abgeglichen. In der zweiten Ausgabe hat der join-Operator den zweiten Schlüssel, der in t1 mit dem Wert „val1.2“ vorhanden ist, nach dem Zufallsprinzip ausgewählt und mit t2-Schlüsseln abgeglichen.

let t1 = datatable(key: long, value: string)  
    [
    1, "val1.1",  
    1, "val1.2"  
];
let t2 = datatable(key: long, value: string)  
    [  
    1, "val1.3",
    1, "val1.4"  
];
t1
| join kind = innerunique
    t2
    on key

Ausgabe

Schlüssel value key1 value1
1 val1.1 1 val1.3
1 val1.1 1 val1.4
let t1 = datatable(key: long, value: string)  
    [
    1, "val1.1",  
    1, "val1.2"  
];
let t2 = datatable(key: long, value: string)  
    [  
    1, "val1.3", 
    1, "val1.4"  
];
t1
| join kind = innerunique
    t2
    on key

Ausgabe

Schlüssel value key1 value1
1 val1.2 1 val1.3
1 val1.2 1 val1.4
  • Kusto ist so optimiert, dass Filter, die nach dem join vorhanden sind, nach Möglichkeit auf die entsprechende Join-Seite (linke oder rechte Seite) gepusht werden.
  • Manchmal wird innerunique als Variante verwendet, und der Filter wird an die linke Seite des Joins weitergegeben. Die Variante wird automatisch weitergegeben, und die Schlüssel, die für diesen Filter gelten, werden in der Ausgabe angezeigt.
  • Verwenden Sie das vorherige Beispiel, und fügen Sie einen Filter where value == "val1.2" hinzu. Es gibt das zweite Ergebnis und gibt nie das erste Ergebnis für die Datasets:
let t1 = datatable(key: long, value: string)  
    [
    1, "val1.1",  
    1, "val1.2"  
];
let t2 = datatable(key: long, value: string)  
    [  
    1, "val1.3", 
    1, "val1.4"  
];
t1
| join kind = innerunique
    t2
    on key
| where value == "val1.2"

Ausgabe

Schlüssel value key1 value1
1 val1.2 1 val1.3
1 val1.2 1 val1.4

Abrufen erweiterter Anmeldeaktivitäten

Abrufen erweiterter Aktivitäten aus einem login, in dem einige Einträge den Start und das Ende einer Aktivität markieren.

let Events = MyLogTable | where type=="Event" ;
Events
| where Name == "Start"
| project Name, City, ActivityId, StartTime=timestamp
| join (Events
    | where Name == "Stop"
        | project StopTime=timestamp, ActivityId)
    on ActivityId
| project City, ActivityId, StartTime, StopTime, Duration = StopTime - StartTime
let Events = MyLogTable | where type=="Event" ;
Events
| where Name == "Start"
| project Name, City, ActivityIdLeft = ActivityId, StartTime=timestamp
| join (Events
        | where Name == "Stop"
        | project StopTime=timestamp, ActivityIdRight = ActivityId)
    on $left.ActivityIdLeft == $right.ActivityIdRight
| project City, ActivityId, StartTime, StopTime, Duration = StopTime - StartTime