innerunique 联接

适用于:✅Azure 数据资源管理器Azure MonitorMicrosoft Sentinel

innerunique 联接方式会删除左侧的重复密钥。 此行为可确保输出包含每个唯一左键和右键组合的行。

默认情况下,在未指定参数“kind”时会使用联接方式“innerunique”。 此默认实现在日志/跟踪分析场景中很有用,在此情况下,你的目标是基于共享的相关 ID 关联两个事件。 它允许检索现象的所有实例,同时忽略导致相关性的重复跟踪记录。

关系图显示了如何联接工作。

语法

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

详细了解语法约定

参数

客户 类型​​ 必需 说明
LeftTable string ✔️ 要合并其行的左侧表或表格表达式(有时称为外部表)。 表示为 $left
提示 string 零个或多个(以空格分隔)以 Name = Value 形式表示的联接提示,用于控制行匹配操作和执行计划的行为。 有关详细信息,请参阅提示
RightTable string ✔️ 要合并其行的右侧表或表格表达式(有时称为内部表)。 表示为 $right
条件 string ✔️ 确定 LeftTable 中的行如何与 RightTable 中的行匹配。 如果要匹配的列在这两个表中具有相同的名称,请使用 ON ColumnName 语法。 否则,请使用 ON $left.LeftColumn == $right.RightColumn 语法。 若要指定多个条件,可以使用“and”关键字,也可以使用逗号分隔它们。 如果使用逗号,则将使用“and”逻辑运算符来计算条件。

提示

为获得最佳性能,如果某个表始终小于另一个表,则将其用作 join 的左侧。

提示

参数名称 说明
hint.remote auto, left, local, right 请参阅跨群集联接
hint.strategy=broadcast 指定在群集节点上共享查询负载的方式。 请参阅广播联接
hint.shufflekey=<key> shufflekey 查询使用键将数据分区,在群集节点上共享查询负载。 请参阅 shuffle 查询
hint.strategy=shuffle 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

输出

Value1 Key1 Value2
b 2 b 10
c 4 c 20
c 4 c 30

注意

键“a”和“d”没有出现在输出中,因为在左侧和右侧都没有匹配的键。

查询执行的是默认联接,此联接是根据联接键复制左侧之后的内联。 重复数据删除将仅保留第一条记录。 重复后,生成的联接左侧为:

Value1
a 1
b 2
c 4

来自 innerunique 联接的两个可能输出

注意

联接方式 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 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

输出

key value key1 value1
1 val1.2 1 val1.3
1 val1.2 1 val1.4
  • Kusto 经过优化,它会尽可能将 join 之后的筛选器推向相应的联接端,不管是左侧还是右侧。
  • 有时,使用的风格是 innerunique,并且筛选器将传播到联接的左侧。 方式会自动传播,并且应用于该筛选器的键会出现在输出中。
  • 使用之前的示例并添加筛选器“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 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