Operatore join
Consente di unire le righe di due tabelle in modo da formare una nuova tabella, facendo corrispondere i valori delle colonne specificate da ogni tabella.
Table1 | join (Table2) on CommonColumn, $left.Col1 == $right.Col2
Sintassi
LeftTable|
join
[JoinParameters] (
RightTable)
on
Attributi
Argomenti
LeftTable: tabella o espressione tabulare a sinistra, a volte definita tabella esterna, di cui devono essere unite le righe. Indicata come
$left
.RightTable: tabella o espressione tabulare a destra, a volte definita tabella interna, di cui devono essere unite le righe. Indicata come
$right
.Attributes: una o più regole delimitate da virgole che descrivono il modo in cui le righe di LeftTable vengono associate alle righe di RightTable. Vengono valutate più regole mediante l'operatore logico
and
.Sono disponibili i tipi seguenti di regola:
Tipo di regola Sintassi Predicate Uguaglianza in base al nome ColumnName where
LeftTable. Columnname==
RightTable. ColumnnameUguaglianza in base al valore $left.
LeftColumn==
$right.
RightColumnwhere
$left.
LeftColumn==
$right.
RightColumnNota
Per 'uguaglianza in base al valore' i nomi di colonna devono essere qualificati con la tabella proprietaria applicabile indicata dalle notazioni
$left
e$right
.JoinParameters: zero o più parametri delimitati da spazi sotto forma di Valore nome
=
che controllano il comportamento dell'operazione di corrispondenza di riga e del piano di esecuzione. Sono supportati i seguenti parametri:Nome dei parametri Valori Descrizione kind
Tipi di join Vedere Tipi di join hint.remote
auto
,left
,local
,right
Vedere Join tra cluster hint.strategy=broadcast
Specifica il modo in cui condividere il carico di query nei nodi del cluster. Vedere broadcast join hint.shufflekey=<key>
La shufflekey
query condivide il carico delle query nei nodi del cluster, usando una chiave per partizionare i dati.Vedere la query casuale hint.strategy=shuffle
La shuffle
query di strategia condivide il carico di query nei nodi del cluster, in cui ogni nodo elabora una partizione dei dati.Vedere la query casuale Nome Valori Descrizione kind
Tipi di join Vedere Tipi di join hint.remote
auto
,left
,local
,right
hint.strategy=broadcast
Specifica il modo in cui condividere il carico di query nei nodi del cluster. Vedere broadcast join hint.shufflekey=<key>
La shufflekey
query condivide il carico delle query nei nodi del cluster, usando una chiave per partizionare i dati.Vedere la query casuale hint.strategy=shuffle
La shuffle
query di strategia condivide il carico di query nei nodi del cluster, in cui ogni nodo elabora una partizione dei dati.Vedere la query casuale
Avviso
Se kind
non è specificato, il tipo di join predefinito è innerunique
. Questo approccio è diverso rispetto ad altri prodotti di analisi che usano inner
come tipo predefinito. Vedere join-flavor per comprendere le differenze e assicurarsi che la query restituisca i risultati previsti.
Restituisce
Lo schema di output dipende dal tipo di join:
Tipo di join | Schema di output. |
---|---|
kind=leftanti , kind=leftsemi |
La tabella risultante contiene le colonne solo del lato sinistro. |
kind=rightanti , kind=rightsemi |
La tabella risultante contiene le colonne solo del lato destro. |
kind=innerunique , kind=inner , kind=leftouter , kind=rightouter , kind=fullouter |
Una colonna per ogni colonna in ognuna delle due tabelle, incluse le chiavi corrispondenti. Le colonne del lato destro verranno automaticamente rinominate in caso di conflitti tra i nomi. |
I record di output dipendono dal tipo di join:
Nota
Se sono presenti più righe con gli stessi valori per tali campi, si otterranno righe per tutte le combinazioni.
Una corrispondenza è una riga selezionata da una tabella che ha lo stesso valore per tutti i campi on
di una riga nell'altra tabella.
Tipo di join | Record di output |
---|---|
kind=leftanti , kind=leftantisemi |
Restituisce tutti i record del lato sinistro che non hanno corrispondenze a destra. |
kind=rightanti , kind=rightantisemi |
Restituisce tutti i record del lato destro che non hanno corrispondenze a sinistra. |
kind non specificato, kind=innerunique |
Solo una riga del lato sinistro viene associata a ogni valore della chiave on . L'output contiene una riga per ogni corrispondenza di questa riga con le righe a destra. |
kind=leftsemi |
Restituisce tutti i record del lato sinistro che hanno corrispondenze a destra. |
kind=rightsemi |
Restituisce tutti i record del lato destro che hanno corrispondenze a sinistra. |
kind=inner |
Restituisce tutti i record corrispondenti dai lati sinistro e destro. |
kind=fullouter |
Restituisce tutti i record per tutti i record dai lati sinistro e destro. Le celle senza corrispondenza contengono valori Null. |
kind=leftouter |
Restituisce tutti i record dal lato sinistro e solo i record corrispondenti dal lato destro. |
kind=rightouter |
Restituisce tutti i record dal lato destro e solo i record corrispondenti dal lato sinistro. |
Suggerimento
Per assicurare prestazioni migliori, se una tabella è sempre più piccola dell'altra, usarla come lato sinistro (pipe inviata) del join.
Esempio
Ottenere le attività estese da login
in cui alcune voci contrassegnano come inizio e fine di un'attività.
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
Tipi di join
Il tipo di operatore join viene specificato con la parola chiave kind. Sono supportati i tipi seguenti di operatore di join:
Tipo di join | Descrizione |
---|---|
innerunique (o vuoto in base all'impostazione predefinita) |
Inner join con deduplicazione del lato sinistro |
inner |
Inner join standard |
leftouter |
Left outer join |
rightouter |
Right outer join |
fullouter |
Full outer join |
leftanti , anti o leftantisemi |
Left anti-join |
rightanti o rightantisemi |
Right anti-join |
leftsemi |
Semi join di sinistra |
rightsemi |
Semi join di destra |
Tipo di join predefinito
Il tipo di join predefinito è un inner join con deduplicazione del lato sinistro. L'implementazione di un join predefinito risulta utile in scenari tipici di analisi di log/traccia in cui si vogliono correlare due eventi, ognuno dei quali corrisponde a un criterio di filtro con lo stesso ID di correlazione. Si vuole che vengano restituiti tutti gli aspetti del fenomeno e che vengano ignorati più aspetti dei record di traccia interessati.
X | join Y on Key
X | join kind=innerunique Y on Key
Le due tabelle di esempio seguenti vengono usate per spiegare l'operazione del join.
Tabella X
Chiave | Value1 |
---|---|
a | 1 |
b | 2 |
b | 3 |
c | 4 |
Tabella Y
Chiave | Value2 |
---|---|
b | 10 |
c | 20 |
c | 30 |
d | 40 |
Il join predefinito esegue un inner join dopo la deduplicazione del lato sinistro nella chiave di join (la deduplicazione mantiene il primo record).
Se si considera l'istruzione seguente: X | join Y on Key
l'effettivo lato sinistro del join, ovvero la tabella X dopo la deduplicazione, sarà:
Chiave | Value1 |
---|---|
a | 1 |
b | 2 |
c | 4 |
e il risultato del join sarà:
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
Output
Chiave | Value1 | Chiave1 | Value2 |
---|---|---|---|
b | 2 | b | 10 |
c | 4 | c | 20 |
c | 4 | c | 30 |
Nota
Le chiavi 'a' e 'd' non vengono visualizzate nell'output poiché non sono presenti chiavi corrispondenti su entrambi i lati destro e sinistro.
Tipo di inner join
La funzione inner join è analoga all'inner join standard di SQL. Un record di output viene generato ogni volta che un record sul lato sinistro ha la stessa chiave di join del record sul lato destro.
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 kind=inner Y on Key
Output
Chiave | Value1 | Chiave1 | Value2 |
---|---|---|---|
b | 3 | b | 10 |
b | 2 | b | 10 |
c | 4 | c | 20 |
c | 4 | c | 30 |
Nota
- È stato eseguito due volte il join di (b,10) dal lato destro: con (b,2) e (b,3) a sinistra.
- È stato eseguito due volte il join di (c,4) nel lato sinistro: con (c,20) e (c,30) a destra.
Tipo di join innerunique
Usare il tipo di join innerunique per deduplicare le chiavi dal lato sinistro. Il risultato sarà una riga dell'output da ogni combinazione di chiavi di sinistra e chiavi di destra deduplicate.
Nota
Il tipo innerunique può restituire due output possibili ed entrambi sono corretti. Nel primo output l'operatore di join ha selezionato in modo casuale la prima chiave visualizzata in t1, con valore "val1.1", e la ha associata con le chiavi t2. Nel secondo output l'operatore di join ha selezionato in modo casuale la seconda chiave visualizzata in t1, con valore "val1.2", e la ha associata con le chiavi 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
Output
Key | Valore | 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
Output
Key | Valore | key1 | value1 |
---|---|---|---|
1 | val1.2 | 1 | val1.3 |
1 | val1.2 | 1 | val1.4 |
Kusto è ottimizzato per il push di filtri che si trovano dopo
join
, verso il lato appropriato del join, a destra o sinistra, quando possibile.Il tipo usato è a volte innerunique e il filtro viene propagato al lato sinistro del join. Il tipo verrà propagato automaticamente e le chiavi applicabili a tale filtro verranno visualizzate sempre nell'output.
Usare l'esempio precedente e aggiungere un filtro
where value == "val1.2"
. Restituirà sempre il secondo risultato e non restituirà mai il primo risultato per i set di dati:
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"
Output
Key | Valore | key1 | value1 |
---|---|---|---|
1 | val1.2 | 1 | val1.3 |
1 | val1.2 | 1 | val1.4 |
Tipo left outer join
Il risultato di un left outer join per le tabelle X e Y contiene sempre tutti i record della tabella di sinistra (X), anche se la condizione di join non rileva alcun record corrispondente nella tabella di destra (Y).
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 kind=leftouter Y on Key
Output
Chiave | Value1 | Chiave1 | Value2 |
---|---|---|---|
a | 1 | ||
b | 2 | b | 10 |
b | 3 | b | 10 |
c | 4 | c | 20 |
c | 4 | c | 30 |
Tipo right outer join
Il tipo right outer join è simile a left outer join, ma il trattamento delle tabelle è invertito.
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 kind=rightouter Y on Key
Output
Chiave | Value1 | Chiave1 | Value2 |
---|---|---|---|
b | 2 | b | 10 |
b | 3 | b | 10 |
c | 4 | c | 20 |
c | 4 | c | 30 |
d | 40 |
Tipo full outer join
Un full outer join corrisponde all'applicazione di entrambi left outer join e right outer join. Se i record nelle tabelle di cui è stato eseguito il join non corrispondono, il set di risultati includerà valori null
per ogni colonna della tabella che non contiene una riga corrispondente. Per i record corrispondenti, verrà generata una singola riga nel set di risultati, contenente i campi popolati da entrambe le tabelle.
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 kind=fullouter Y on Key
Output
Chiave | Value1 | Chiave1 | Value2 |
---|---|---|---|
a | 1 | ||
b | 2 | b | 10 |
b | 3 | b | 10 |
c | 4 | c | 20 |
c | 4 | c | 30 |
d | 40 |
Tipo left anti join
Left anti join restituisce tutti i record del lato sinistro che non corrispondono ad alcun record del lato destro.
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 kind=leftanti Y on Key
Output
Chiave | Value1 |
---|---|
a | 1 |
Nota
Anti-join definisce la query "NOT IN".
Tipo right anti join
Right anti join restituisce tutti i record del lato destro che non corrispondono ad alcun record del lato sinistro.
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 kind=rightanti Y on Key
Output
Chiave | Value2 |
---|---|
d | 40 |
Nota
Anti-join definisce la query "NOT IN".
Tipo left semi join
Left semi join restituisce tutti i record del lato sinistro che corrispondono a un record del lato destro. Vengono restituite solo le colonne dal lato sinistro.
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 kind=leftsemi Y on Key
Output
Chiave | Value1 |
---|---|
b | 2 |
b | 3 |
c | 4 |
Tipo right semi join
Right semi join restituisce tutti i record del lato destro che corrispondono a un record del lato sinistro. Vengono restituite solo le colonne del lato destro.
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 kind=rightsemi Y on Key
Output
Chiave | Value2 |
---|---|
b | 10 |
c | 20 |
c | 30 |
Cross join
Kusto non fornisce un tipo cross join in modalità nativa. Non è possibile contrassegnare l'operatore con kind=cross
.
Per la simulazione, usare una chiave fittizia.
X | extend dummy=1 | join kind=inner (Y | extend dummy=1) on dummy
Hint di join
L'operatore join
supporta alcuni hint che controllano la modalità di esecuzione di una query.
Questi hint non cambiano la semantica di join
, ma potrebbero influire sulle rispettive prestazioni.
Gli hint di join vengono illustrati negli articoli seguenti:
hint.shufflekey=<key>
ehint.strategy=shuffle
- Query casualehint.strategy=broadcast
- Join di trasmissionehint.remote=<strategy>
- Join tra cluster