Udostępnij za pośrednictwem


innerunique join

Dotyczy: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Sprzężenia innerunique usuwa zduplikowane klucze po lewej stronie. To zachowanie gwarantuje, że dane wyjściowe zawierają wiersz dla każdej kombinacji unikatowych po lewej i prawej stronie.

Domyślnie opcja sprzężenia jest używana, innerunique jeśli kind parametr nie jest określony. Ta domyślna implementacja jest przydatna w scenariuszach analizy dzienników/śledzenia, w których celem jest skorelowanie dwóch zdarzeń na podstawie udostępnionego identyfikatora korelacji. Umożliwia pobieranie wszystkich wystąpień zjawiska, pomijając zduplikowane rekordy śledzenia, które przyczyniają się do korelacji.

Diagram przedstawiający sposób działania sprzężenia.

Składnia

LeftTable [ Hints ] RightTable on | join kind=innerunique Conditions

Dowiedz się więcej na temat konwencji składni.

Parametry

Nazwisko Type Wymagania opis
LeftTable string ✔️ Lewa tabela lub wyrażenie tabelaryczne, czasami nazywane tabelą zewnętrzną, której wiersze mają zostać scalone. Oznaczono jako $left.
Wskazówki string Zero lub więcej wskazówek sprzężenia rozdzielanych spacjami w postaci wartości nazwy = , które kontrolują zachowanie operacji dopasowania wiersza i planu wykonania. Aby uzyskać więcej informacji, zobacz Wskazówki.
RightTable string ✔️ Prawa tabelaryczna lub tabelaryczna wyrażenie, czasami nazywane tabelą wewnętrzną, której wiersze mają zostać scalone. Oznaczono jako $right.
Warunki string ✔️ Określa, jak wiersze z tabeli LeftTable są dopasowywane do wierszy z tabeli RightTable. Jeśli kolumny, które chcesz dopasować, mają taką samą nazwę w obu tabelach, użyj składni ON ColumnName. W przeciwnym razie użyj składni ON $left.LeftColumn RightColumn==$right.. Aby określić wiele warunków, możesz użyć słowa kluczowego "and" lub oddzielić je przecinkami. Jeśli używasz przecinków, warunki są oceniane przy użyciu operatora logicznego "i".

Napiwek

Aby uzyskać najlepszą wydajność, jeśli jedna tabela jest zawsze mniejsza niż druga, użyj jej jako lewej strony sprzężenia.

Wskazówki

Nazwa parametrów Wartości opis
hint.remote auto, , left, , localright Zobacz Łączenie między klastrami
hint.strategy=broadcast Określa sposób udostępniania obciążenia zapytania w węzłach klastra. Zobacz sprzężenia emisji
hint.shufflekey=<key> Zapytanie shufflekey współudzieli obciążenie zapytania w węzłach klastra przy użyciu klucza do partycjonowania danych. Zobacz zapytanie mieszania
hint.strategy=shuffle shuffle Zapytanie strategii współudzieli obciążenie zapytania w węzłach klastra, gdzie każdy węzeł przetwarza jedną partycję danych. Zobacz zapytanie mieszania

Zwraca

Schemat: wszystkie kolumny z obu tabel, w tym pasujące klucze.
Wiersze: wszystkie deduplikowane wiersze z lewej tabeli pasujące do wierszy z prawej tabeli.

Przykłady

Użyj domyślnego sprzężenia innerunique

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

Wyjście

Klucz Wartość1 Klucz1 Wartość2
b 2 b 10
c 100 c 20
c 100 c 30

Uwaga

Klucze "a" i "d" nie są wyświetlane w danych wyjściowych, ponieważ nie było pasujących kluczy po lewej i prawej stronie.

Zapytanie wykonało sprzężenie domyślne, czyli sprzężenie wewnętrzne po deduplikacji lewej strony na podstawie klucza sprzężenia. Deduplikacja przechowuje tylko pierwszy rekord. Wynikowa lewa strona sprzężenia po deduplikacji to:

Klucz Wartość1
a 1
b 2
c 100

Dwa możliwe dane wyjściowe z sprzężenia innerunique

Uwaga

Smak innerunique sprzężenia może przynieść dwa możliwe dane wyjściowe, a oba są poprawne. W pierwszych danych wyjściowych operator sprzężenia losowo wybrał pierwszy klucz wyświetlany w t1 z wartością "val1.1" i dopasował go do kluczy t2. W drugim danych wyjściowych operator sprzężenia losowo wybrał drugi klucz wyświetlany w t1 z wartością "val1.2" i dopasował go do kluczy 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

Wyjście

key wartość klucz1 wartość1
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

Wyjście

key wartość klucz1 wartość1
1 val1.2 1 val1.3
1 val1.2 1 val1.4
  • Usługa Kusto jest zoptymalizowana pod kątem wypychania filtrów, które pochodzą po joinstronie , w kierunku odpowiedniej strony sprzężenia, lewej lub prawej, gdy jest to możliwe.
  • Czasami używany smak jest innyrunique , a filtr jest propagowany po lewej stronie sprzężenia. Smak jest automatycznie propagowany, a klucze, które mają zastosowanie do tego filtru, są wyświetlane w danych wyjściowych.
  • Użyj poprzedniego przykładu i dodaj filtr where value == "val1.2" . Daje drugi wynik i nigdy nie daje pierwszego wyniku dla zestawów danych:
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"

Wyjście

key wartość klucz1 wartość1
1 val1.2 1 val1.3
1 val1.2 1 val1.4

Uzyskiwanie rozszerzonych działań związanych z logowaniem

Pobierz działania rozszerzone od login elementu, które niektóre wpisy oznaczają jako początek i koniec działania.

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