通过匹配每个表中指定列的值,合并两个表的行以组成新表。
LeftTable
|
join
[
JoinParameters
]
(
RightTable
)
on
Attributes
一个或多个逗号分隔的规则,这些规则描述 LeftTable 中的行如何与 RightTable 中的行进行匹配。 将使用
and
逻辑运算符评估多个规则。 请参阅
规则
。
JoinParameters
string
零个或零个以上(以空格分隔)以 Name
=
Value 形式表示的参数,用于控制行匹配操作和执行计划的行为。 请参阅
支持的参数
。
Predicate
如果未指定
kind
,则默认的联接风格为
innerunique
。 这不同于其他的一些分析产品,这些产品以
inner
作为默认风格。 请参阅
联接风格
来了解不同之处,确保查询产生预期结果。
输出架构取决于联接风格:
| 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
join 运算符的确切风格是通过 kind 关键字指定的。 支持 join 运算符的以下风格:
联接类型/风格
默认联接风格
默认联接风格是在左侧删除了重复数据的内联。 在典型的日志/跟踪分析方案中,默认联接实现非常有用。在这种方案中,你想要关联两个事件,每个事件都在同一个相关 ID 下匹配某个筛选条件。 你需要获取所有出现的现象,忽略多次出现的构成跟踪记录。
X | join Y on Key
X | join kind=innerunique Y on Key
下面的两个示例表用来说明联接操作。
Value1
内联函数类似于 SQL 中的标准内联。 只要左侧的记录具有与右侧记录相同的联接键,就会生成输出记录。
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 kind=inner Y on Key
Value1
Value2
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"
| join kind = innerunique
on key
value
value1
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"
| join kind = innerunique
on key
| where value == "val1.2"
value
value1
左外部联接风格
表 X 和 Y 的左外部联接的结果始终包含左表 (X) 的所有记录,即使联接条件在右表 (Y) 中未找到任何匹配记录。
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 kind=leftouter Y on Key
Value1
Value2
完全外部联接风格
完全外部联接合并了应用左外部联接和右外部联接的效果。 如果联接的表中的记录不匹配,则对于表中缺少匹配行的每个列,结果集都会有 null 值。 对于那些匹配的记录,结果集中会生成单个行(其中包含两个表中填充的字段)。
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 kind=fullouter Y on Key
Value1
Value2
Kusto 本身不提供交叉联接风格。 无法用 kind=cross 来标记运算符。
若要进行模拟,请使用虚拟键。
X | extend dummy=1 | join kind=inner (Y | extend dummy=1) on dummy
join 运算符支持许多用于控制查询运行方式的提示。
这些提示不会更改 join 的语义,但可能会影响其性能。
以下文章解释了联接提示:
hint.shufflekey=<key> 和 hint.strategy=shuffle - 随机执行查询
hint.strategy=broadcast - 广播联接
hint.remote=<strategy> - 跨群集联接