Share via


innerunique 結合

結合フレーバーは innerunique 、左側から重複するキーを削除します。 この動作により、一意の左キーと右キーの組み合わせごとに出力に行が含まれるようにします。

既定では、 パラメーターが innerunique 指定されていない場合は、 kind 結合フレーバーが使用されます。 この既定の実装は、共有相関 ID に基づいて 2 つのイベントを関連付けるログ/トレース分析シナリオで役立ちます。 これにより、相関に寄与する重複するトレース レコードを無視しながら、現象のすべてのインスタンスを取得できます。

結合のしくみを示す図。

構文

LeftTable|joinkind=innerunique [ ヒント ] RightTableon条件

構文規則について詳しく知る。

パラメーター

名前 必須 説明
LeftTable string ✔️ 行をマージする左側のテーブルまたは表形式の式。外部テーブルとも呼ばれます。 $left と示されます。
[ヒント] string 行の照合操作と実行プランの動作を制御する、スペースで区切られた "名前 = 値" の形式の 0 個以上の結合のヒント。 詳細については、「ヒント」を参照してください。
RightTable string ✔️ 行をマージする右側のテーブルまたは表形式の式。内部テーブルとも呼ばれます。 $right と示されます。
条件 string ✔️ LeftTable の行を RightTable の行と照合する方法を指定します。 照合する列の名前が両方のテーブルで同じである場合は、ONColumnName 構文を使用します。 それ以外の場合は、ON $left.LeftColumn==$right. RightColumn 構文を使用します。 複数の条件を指定するには、"and" キーワードを使用するか、コンマで区切ります。 コンマを使用する場合、条件は "and" 論理演算子を使用して評価されます。

ヒント

パフォーマンスを最高にするには、一方のテーブルが他より常に小さい場合は、それを結合の左側として使用します。

[ヒント]

パラメーター名 説明
hint.remote auto, left, local, right クラスター間の結合」を参照してください
hint.strategy=broadcast クラスター ノードでクエリ負荷を共有する方法を指定します。 ブロードキャスト結合を参照してください。
hint.shufflekey=<key> shufflekey クエリは、データをパーティション化するキーで、クラスター ノードのクエリ負荷を共有します。 クエリ*のシャッフルを参照
hint.strategy=shuffle shuffle 戦略クエリは、クラスター ノードのクエリ負荷を共有します。各ノードで 1つずつ、データのパーティション化を処理します。 クエリ*のシャッフルを参照

戻り値

スキーマ: 一致するキーを含む、両方のテーブルのすべての列。
: 右側のテーブルの行と一致する左側のテーブルから重複除去されたすべての行。

既定の 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

出力

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

Note

キー "a" と "d" は、左側と右側に一致するキーがなかったため、出力には含まれません。

クエリによって既定の結合が実行されました。これは、結合キーに基づいて左側を重複除去した後の内部結合です。 重複除去では、最初のレコードのみが保持されます。 重複除去後の結合の結果の左側は次のとおりです。

Key Value1
a 1
b 2
c 4

innerunique 結合からの 2 つの可能な出力

Note

結合フレーバーは innerunique 、2 つの可能な出力を生成し、両方が正しい場合があります。 1 つ目の出力では、join 演算子によって、t1 で出現する 1 番目のキー (値が "val1.1" のもの) がランダムに選択され、、t2 のキーと照合されます。 2 つ目の出力では、join 演算子によって、t1 で出現する 2 番目のキー (値が "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" 。 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