внутреннее соединение

Вариант innerunique соединения удаляет повторяющиеся ключи с левой стороны. Это гарантирует, что выходные данные содержат строку для каждого сочетания уникальных клавиш слева и справа.

По умолчанию вариант соединения используется, innerunique если kind параметр не указан. Эта реализация по умолчанию полезна в сценариях анализа журналов и трассировки, где вы хотите сопоставить два события на основе общего идентификатора корреляции. Он позволяет получить все экземпляры явления, игнорируя повторяющиеся записи трассировки, которые влияют на корреляцию.

Схема, на которую показано, как работает соединение.

Синтаксис

LeftTable|joinkind=innerunique [ Подсказки ] RightTableonУсловия

Дополнительные сведения о соглашениях о синтаксисе.

Параметры

Имя Тип Обязательно Описание
LeftTable string ✔️ Левая таблица или табличное выражение, иногда называемое внешней таблицей, строки которой должны быть объединены. Обозначается как $left.
Указания string Ноль или несколько указаний соединения с разделителями-пробелами в виде значения имени=, которые управляют поведением операции сопоставления строк и плана выполнения. Дополнительные сведения см. в разделе Подсказки.
RightTable string ✔️ Правильная таблица или табличное выражение, иногда называемое внутренней таблицей, строки которой должны быть объединены. Обозначается как $right.
Условия string ✔️ Определяет, как строки из LeftTable сопоставляются со строками из RightTable. Если столбцы, которые необходимо сопоставить, имеют одинаковые имена в обеих таблицах, используйте синтаксис ONColumnName. В противном случае используйте синтаксис ON $left.LeftColumn==$right.RightColumn. Чтобы указать несколько условий, можно использовать ключевое слово "и" или разделять их запятыми. Если используются запятые, условия вычисляются с помощью логического оператора "и".

Совет

Для оптимальной производительности, если одна таблица всегда меньше другой, используйте ее в качестве левой части соединения.

Указания

Имя параметра Значения Описание
hint.remote auto, left, local, right См. статью Межкластерный оператор join.
hint.strategy=broadcast Указывает способ совместного использования нагрузки запросов на узлы кластера. См . широковещательное присоединение
hint.shufflekey=<key> Запрос shufflekey разделяет нагрузку на узлы кластера, используя ключ для секционирования данных. См. запрос на перетасовку
hint.strategy=shuffle Запрос shuffle стратегии разделяет нагрузку запросов на узлы кластера, где каждый узел обрабатывает одну секцию данных. См. запрос на перетасовку

Возвращаемое значение

Схема: все столбцы из обеих таблиц, включая соответствующие ключи.
Строки: все дедуплицированные строки из левой таблицы, которые соответствуют строкам из правой таблицы.

Примеры

Использование внутреннего соединения по умолчанию

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

Выходные данные

Ключ Значение1 Key1 Значение2
b 2 b 10
с 4 с 20
с 4 с 30

Примечание

Ключи a и d не отображаются в выходных данных, поскольку соответствующие ключи отсутствуют и справа, и слева.

Запрос выполнил соединение по умолчанию, которое является внутренним соединением после дедупликации левой стороны на основе ключа соединения. Дедупликация сохраняет только первую запись. Результирующая левая часть соединения после дедупликации:

Ключ Значение1
a 1
b 2
с 4

Два возможных выхода из внутреннего соединения

Примечание

Вариант innerunique соединения может дать два возможных выходных данных, и оба являются правильными. В первых выходных данных оператор join случайным образом выбрал первый ключ, который отображается в t1 со значением val1.1, и сопоставил его с ключами t2. Во вторых выходных данных оператор join случайным образом выбрал второй ключ, который отображается в t1 со значением val1.2, и сопоставил его с ключами 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

Выходные данные

ключ 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

Выходные данные

ключ value key1 value1
1 val1.2 1 val1.3
1 val1.2 1 val1.4
  • Решение Kusto оптимизировано для смещения фильтров (при возможности), которые указаны после join, ближе к соответствующей стороне join (левой или правой).
  • В некоторых случаях используется вариант innerunique, а фильтр распространяется на левую сторону оператора join. Вкус автоматически распространяется, и ключи, применяемые к фильтру, отображаются в выходных данных.
  • Используйте предыдущий пример и добавьте фильтр where value == "val1.2" . Он дает второй результат и никогда не даст первый результат для наборов данных:
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"

Выходные данные

ключ value key1 value1
1 val1.2 1 val1.3
1 val1.2 1 val1.4

Получение расширенных действий входа

Получите расширенные сведения о действиях из login, которым некоторые записи помечают время начала и конца действия.

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