相关文章推荐
讲道义的橡皮擦  ·  Static Libraries ...·  1 年前    · 
大气的香槟  ·  mysql ...·  1 年前    · 
不敢表白的牛肉面  ·  vue+mapbox-gl-draw ...·  1 年前    · 

通过匹配每个表中指定列的值,合并两个表的行以组成新表。

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> - 跨群集联接
  •