соединение innerunique
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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 , , left local right |
См. статью Межкластерный оператор 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
Связанный контент
- Узнайте о других вкусах соединения