jointure innerunique

La innerunique saveur de jointure supprime les clés dupliquées du côté gauche. Ce comportement garantit que la sortie contient une ligne pour chaque combinaison unique de touches gauche et droite.

Par défaut, la saveur de innerunique jointure est utilisée si le kind paramètre n’est pas spécifié. Cette implémentation par défaut est utile dans les scénarios d’analyse des journaux/traces, où vous visez à mettre en corrélation deux événements en fonction d’un ID de corrélation partagé. Il vous permet de récupérer toutes les instances du phénomène tout en ignorant les enregistrements de trace dupliqués qui contribuent à la corrélation.

Diagramme montrant le fonctionnement de la jointure.

Syntax

LeftTable|joinkind=innerunique [ Indicateurs ] RightTableonConditions

Découvrez les conventions de syntaxe.

Paramètres

Nom Type Obligatoire Description
LeftTable string ✔️ La table de gauche ou expression tabulaire, parfois appelée « table externe », dont les lignes doivent être fusionnées. Désignée sous la forme suivante : $left.
Indicateurs string Zéro ou plusieurs indicateurs de jointure séparés par un espace, sous la forme Nom=Valeur, qui contrôlent le comportement de l’opération de mise en correspondance des lignes et du plan d’exécution. Pour plus d’informations, consultez Indicateurs.
RightTable string ✔️ La table de droite ou expression tabulaire, parfois appelée « table interne », dont les lignes doivent être fusionnées. Désignée sous la forme suivante : $right.
Conditions string ✔️ Détermine le mode de mise en correspondance des lignes de LeftTable avec les lignes de RightTable. Si les colonnes à mettre en correspondre ont le même nom dans les deux tables, utilisez la syntaxe ONColumnName. Sinon, utilisez la syntaxe ON $left.LeftColumn==$right.RightColumn. Pour spécifier plusieurs conditions, vous pouvez utiliser le mot clé « and » ou séparer les conditions par des virgules. Si vous utilisez des virgules, les conditions sont évaluées avec l’opérateur logique « and ».

Conseil

Pour des performances optimales, si une table est toujours plus petite que l’autre, utilisez-la pour le côté gauche de la jointure.

Indicateurs

Nom des paramètres Valeurs Description
hint.remote auto, left, local, right Voir Jointure entre clusters
hint.strategy=broadcast Spécifie comment partager la charge de la requête sur les nœuds du cluster. Consultez Répartir une jointure.
hint.shufflekey=<key> La requête shufflekey partage la charge de requête sur les nœuds de cluster à l’aide d’une clé pour partitionner les données. Voir requête de lecture aléatoire
hint.strategy=shuffle La requête de stratégie shuffle partage la charge de requête sur les nœuds de cluster, où chaque nœud traite une partition des données. Voir requête de lecture aléatoire

Retours

Schéma : toutes les colonnes des deux tables, y compris les clés correspondantes.
Lignes : toutes les lignes dédupliquées de la table de gauche qui correspondent aux lignes de la table de droite.

Exemples

Utiliser la jointure innerunique par défaut

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

Sortie

Clé Value1 Clé1 Value2
b 2 b 10
c 4 c 20
c 4 c 30

Notes

Les clés « a » et « d » n'apparaissent pas dans la sortie, car elles ne figuraient pas à la fois du côté gauche et du côté droit.

La requête a exécuté la jointure par défaut, qui est une jointure interne après avoir dédupliquée le côté gauche en fonction de la clé de jointure. La déduplication conserve uniquement le premier enregistrement. Le côté gauche de la jointure après la déduplication est le suivant :

Clé Value1
a 1
b 2
c 4

Deux sorties possibles de la jointure innerunique

Notes

La innerunique saveur de jointure peut produire deux sorties possibles et les deux sont correctes. Dans la première sortie, l'opérateur de jointure a sélectionné au hasard la première clé qui apparaît dans t1, avec la valeur « val1.1 », et l'a mise en correspondance avec les clés t2. Dans la deuxième sortie, l'opérateur de jointure a sélectionné au hasard la deuxième clé qui apparaît dans t1, avec la valeur « val1.2 », et l'a mise en correspondance avec les clés t2.

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

Sortie

key value key1 valeur1
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

Sortie

key value key1 valeur1
1 val1.2 1 val1.3
1 val1.2 1 val1.4
  • Kusto est optimisé pour transmettre (push) les filtres qui suivent l'opérateur join vers le côté approprié de la jointure, à gauche ou à droite, lorsque cela est possible.
  • Parfois, la saveur utilisée est innerunique et le filtre est propagé vers le côté gauche de la jointure. La saveur est propagée automatiquement et les clés qui s’appliquent à ce filtre apparaissent dans la sortie.
  • Utilisez l’exemple précédent et ajoutez un filtre where value == "val1.2" . Il donne le deuxième résultat et ne donnera jamais le premier résultat pour les jeux de données :
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"

Sortie

key value key1 valeur1
1 val1.2 1 val1.3
1 val1.2 1 val1.4

Obtenir des activités de connexion étendues

Obtenez des activités étendues à partir d'un login que certaines entrées marquent comme le début et la fin d'une activité.

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