メインコンテンツまでスキップ
Sumo Logic Japanese

join

join operator は、2 つ以上のデータ ストリームのレコードを結合します。結果はオンザフライで承認されるため、リアルタイムでテーブルを作成できます。その後、各テーブルに共通の値が検索結果として表示されます。

Sumo Logic の join operator の仕組みは、内部 SQL join とほとんど同じです。

構文

[search terms] | join
(parse "starting stream from *" AS a) as t1,
(parse "starting search * from parent stream *" AS b, c) as t2,
(parse "starting save * from parent stream *" AS d, e) as t3
on t1.a = t2.c
and t1.a = t3.e

次の構文を使用して timewindow を追加することで、結合する時間レコードの範囲を制限できます。

...[search terms] | join
(parse "starting stream from *" AS a) as t1,
(parse "starting search * from parent stream *" AS b, c) as t2,
(parse "starting save * from parent stream *" AS d, e) as t3
on t1.a = t2.c
and t1.a = t3.e
[timewindow 10m]

on 句の後の各テーブルのフィールドを処理するには、次の構文を使用します。

...[search terms] | join
(parse "starting stream from *" AS a) AS t1,
(parse "starting search * from parent stream *" AS b, c) AS t2
on t1.a = t2.c
| fields t1_a, t2_b

ルール

  • クエリ用に 2 つ以上のテーブルを作成する必要があります。
  • クエリで選択する時間範囲にデータが存在する必要があります。
  • join はダッシュボード パネルで使用できますが、クエリでは最初の group-by 句の後で使用する必要があります。
  • subquery もサポートされ、aggregation operator を含めることができます。

制限事項

  • 入力のメッセージ数は 50,000 件に制限されており、2 つのテーブル間での結合オペレーションでは各テーブルで 25,000 件に制限されます。この制限を超えると、エラー メッセージが返されます。 
  • 連結条件 (AND) のみが使用できます。NOT 条件や OR 条件は使用できません。
  • join operator は、スライド ウィンドウを使用して結合候補を格納することで、2 つの大きなリレーションを結合する際にメモリが無尽蔵に消費されてしまう事態を防止します。このため、結合の結果が不完全になったり、実行ごとに一貫しなかったりする場合があります。
  • 現在、on 句では次の条件がサポートされています。
    t1.a = 3
    t1.a != t2.c
    NOT t1.a
    t1.a = t2.c OR t1.b = t2.d

join operator クエリの実行

この例では、次のようなログを使用して、2 つのテーブルに対して結合クエリを実行します。

starting stream from stream-2454
starting stream from stream-7343
starting search search-733434 from parent stream stream-2454
starting search search-854343 from parent stream stream-7343
starting stream from stream-6543
starting search search-455563 from parent stream stream-6543
starting search search-32342 from parent stream stream-7343

次のようなクエリを実行した場合:

* | join 
(parse "starting stream from *" AS a) AS T1, 
(parse "starting search * from parent stream *" AS b, c) AS T2 
on T1.a = T2.c

次のような結果が返されます。

a b c
stream-2454 search-733434 stream-2454
stream-7343 search-854343 stream-7343
stream-7343 search-32342 stream-7343
stream-6543 search-854343 stream-6543

パフォーマンス

join operator は、膨大な処理時間を消費する場合があります。そのため、ログ メッセージを減らすための選択を考慮する必要があります。join operator のパフォーマンスを高めるには、次の例に示すように、クエリ式の先頭付近で parse operator を使用して、検索アンカーを検索範囲の前にもって行きます。

("starting stream from" OR "starting search") | join
(parse "starting stream from *" AS a) AS t1,
(parse "starting search * from parent stream *" AS b, c) AS t2
on t1.a = t2.c...

join operator と diff operator の併用

次のようなログがあるとします。

event=login session=12345 time=20130512
event=purchase session=12345 value=50
event=login session=23456 time=20130513
event=purchase session=12345 value=100
event=purchase session=23456 value=120
event=purchase session=23456 value=200
event=purchase session=23456 value=20

 

次のようなクエリを実行した場合:

* | join 
(parse "event=login session=* time=*" AS s1,time) as t1, 
(parse "event=purchase session=* value=*" AS s2, v2) as t2 
on t1.s1 = t2.s2

次のような結果が返されます。

s1 time s2 v2
12345 20130512 12345 50
12345 20130512 12345 100
23456 20130513 23456 120
23456 20130513 23456 200
23456 20130513 23456 20

次のように diff operator を追加すると:

* | join 
(parse "event=login session=* time=*" AS s1,time) as t1, 
(parse "event=purchase session=* value=*" AS s2, v2) as t2 
on t1.s1 = t2.s2 
| diff t2_v2 by t2_s2

次のような結果が返されます。

s1 time s2 v2 _diff
12345 20170512 12345 50 null
12345 20170512 12345 100 50
23456 20170513 23456 120 null
23456 20170513 23456 200 80
23456 20170513 23456 20 -180

diff を使用した別の例として、次のようなクエリを実行すると:

_sourceCategory=[sourceCategoryName] | join
(parse "Attempting to execute task *. delay: * ms." as taskId, delay) as t1,
(parse "Completed execution of task *. Execution duration: * s" as taskId, duration) as t2
on t1.taskId = t2.taskId
| diff t1_delay as delay_diff
| fields t1_taskId, t1_delay, delay_diff, t2_duration

[Aggregate (集計)] タブに次のような結果が返されます。

NewAggregation.png

on 句の後にあるフィールドの処理

次のような結合クエリがあるとします。

* | join 
(parse "starting stream from *" AS a) AS t1, 
(parse "starting search * from parent stream *" AS b, c) AS t2 
on t1.a = t2.c

join ステートメントの後で、以降の句で T1.a フィールドと T2.b フィールドを使用するには、それぞれ T1_a および T1_b として参照します。たとえば、fields operator を使用して T1.a と T2.b の値を抽出するには、次のクエリを使用します。

* | join
(parse "starting stream from *" AS a) AS t1,
(parse "starting search * from parent stream *" AS b, c) AS t2
on t1.a = t2.c
fields t1_a, t2_b

  • この記事は役に立ちましたか?