Поделиться через


соединение innerunique

Область применения: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

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

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

Схема, показывающая, как работает соединение.

Синтаксис

LeftTable | join kind=innerunique [ Подсказки ] Условия rightTable on

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

Параметры

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

Совет

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

Подсказки

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

Возвраты

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

Примеры

Использование соединения 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

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

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

Примечание.

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

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

Ключ Значение1
a 1
б 2
c 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

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

key значение 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

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

key значение 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"

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

key значение 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