Aracılığıyla paylaş


tarama işleci

Verileri, eşleşmeleri tarar ve koşula göre diziler oluşturur.

Eşleşen kayıtlar, işlecin adımlarında tanımlanan koşula göre belirlenir. Koşul, önceki adımlarla oluşturulan duruma bağlı olabilir. Eşleşen kaydın çıktısı, işlecin adımlarında tanımlanan giriş kaydı ve atamalar tarafından belirlenir.

Syntax

T| scan [ with_match_id=MatchIdColumnName ] [ declare(ColumnDeclarations) ] with(StepDefinitions)

ColumnDeclarations söz dizimi

Columnname:ColumnType[=DefaultValue ] [, ... ]

StepDefinition söz dizimi

stepStepName [ output | lastall = | none] :Condition [ =>Sütun=Ataması [, ... ] ];

Söz dizimi kuralları hakkında daha fazla bilgi edinin.

Parametreler

Ad Tür Gerekli Açıklama
T string ✔️ Giriş tablosal kaynağı.
MatchIdColumnName string Tarama yürütmesinin bir parçası olarak çıktıya eklenen türdeki long bir sütunun adı. Kayıt için eşleşmenin 0 tabanlı dizinini gösterir.
ColumnDeclarations string T şemasına bir uzantı bildirir. Bu sütunlara adımlarda değerler atanır. Atanmamışsa DefaultValue döndürülür. Aksi belirtilmedikçe DefaultValue değeridir null.
StepName string ✔️ Koşulları ve atamaları tarama durumundaki değerlere başvurmak için kullanılır. Adım adı benzersiz olmalıdır.
Condition string ✔️ Girişten hangi kayıtların adımla eşleşdiğini tanımlayan veya false olarak değerlendirilen true bir ifade. Kayıt, koşul true adımın durumuyla veya önceki adımın durumuyla olduğunda adımla eşleşir.
Atama string Kayıt bir adımla eşleştiğinde ilgili sütuna atanan skaler ifade.
output string Yinelenen eşleşmelerde adımın çıkış mantığını denetler. all adımla eşleşen tüm kayıtların çıkışını alır, last adım için yinelenen eşleşme dizisindeki yalnızca son kaydın çıkışını alır ve none adımla eşleşen kayıtların çıkışını vermez. Varsayılan değer: all.

Döndürülenler

Girişten bir adıma kaydın her eşleşmesi için bir kayıt. Çıkışın şeması, yan tümcesindeki sütunla genişletilmiş kaynağın declare şemasıdır.

Tarama mantığı

scan serileştirilmiş giriş verilerinin üzerinden geçer, kayda göre kaydeder ve her bir kaydı her adımın geçerli durumunu hesaba katarak her adımın koşuluyla karşılaştırırken.

Durum

İşlecin temel alınan durumu scan , her stepbiri için bir satırı olan bir tablo olarak düşünülebilir. Her adım, önceki adımların ve geçerli adımın tümlerinden sütunların ve bildirilen değişkenlerin en son değerleriyle kendi durumunu korur. Uygunsa, devam eden sıranın eşleşme kimliğini de tutar.

Tarama işlecinin s_1, s_2, ..., s_n adlı n adımı varsa,adım s_ks_1, s_2, ..., s_k karşılık gelen durumunda k kayıtları olur. StepName. ColumnName biçimi, durumundaki bir değere başvurmak için kullanılır. Örneğin, s_2.col1s_kdurumundaki adım s_2 ait olan sütuna col1 başvurur. Ayrıntılı bir örnek için tarama mantığı kılavuzuna bakın.

Durum boş başlar ve taranan giriş kaydı bir adımla eşleştiğinde güncelleştirilir. Geçerli adımın durumu boş olduğunda, adım etkin bir diziye sahip olmak olarak adlandırılır.

Eşleşen mantık

Her giriş kaydı, son adımdan birinciye doğru ters sırada tüm adımlara göre değerlendirilir. Bir r kaydı bir adım s_k karşı değerlendirildiğinde aşağıdaki mantık uygulanır:

  • Denetim 1: Önceki adımın (s_k-1) durumu boşsa ve rs_kKoşulunu karşılıyorsa, bir eşleşme oluşur. Eşleşme aşağıdaki eylemlere yol açar:

    1. s_k durumu temizlenir.
    2. s_k-1 durumu, s_k durumuna yükseltilir.
    3. s_k atamaları hesaplanır ve r'yi genişletir.
    4. Genişletilmiş r , çıkışa ve s_k durumuna eklenir.

    Not

    Check 1 eşleşmeyle sonuçlanırsa, Check 2 göz ardı edilir ve r, s_k-1'e karşı değerlendirilmek üzere devam eder.

  • Denetim 2:s_k durumunun etkin bir sırası varsa veya ilk adım s_k ise ve rs_kKoşulunu karşılıyorsa, bir eşleşme oluşur. Eşleşme aşağıdaki eylemlere yol açar:

    1. s_k atamaları hesaplanır ve r'yi genişletir.
    2. s_k durumundaki s_k temsil eden değerler genişletilmiş r değerleriyle değiştirilir.
    3. s_k olarak output=alltanımlanmışsa, genişletilmiş r çıktıya eklenir.
    4. İlk adım s_k ise, yeni bir sıra başlar ve eşleşme kimliği tarafından 1artar. Bu yalnızca kullanıldığında çıkışı with_match_id etkiler.

s_k denetimleri tamamlandıktan sonra r, s_k-1'e göre değerlendirilmek üzere devam eder.

Bu mantığın ayrıntılı bir örneği için tarama mantığı kılavuzuna bakın.

Örnekler

Birikmeli toplam

Giriş sütunu için birikmeli toplamı hesaplama. Bu örneğin sonucu , row_cumsum() kullanımıyla eşdeğerdir.

range x from 1 to 5 step 1 
| scan declare (cumulative_x:long=0) with 
(
    step s1: true => cumulative_x = x + s1.cumulative_x;
)

Çıkış

x cumulative_x
1 1
2 3
3 6
4 10
5 15

Sıfırlama koşulu olan birden çok sütunda toplu toplam

İki giriş sütunu için birikmeli toplamı hesaplayın, toplam toplam 10 veya daha fazla değere ulaştığında toplam değerini geçerli kayıt değerine sıfırlayın.

range x from 1 to 5 step 1
| extend y = 2 * x
| scan declare (cumulative_x:long=0, cumulative_y:long=0) with 
(
    step s1: true => cumulative_x = iff(s1.cumulative_x >= 10, x, x + s1.cumulative_x), 
                     cumulative_y = iff(s1.cumulative_y >= 10, y, y + s1.cumulative_y);
)

Çıkış

x y cumulative_x cumulative_y
1 2 1 2
2 4 3 6
3 6 6 12
4 8 10 8
5 10 5 18

Sütunu ileri doğru doldurma

Dize sütununu ileri doğru doldurun. Her boş değere son görülen ve olmayan değer atanır.

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "",
    2m, "B",
    3m, "",
    4m, "",
    6m, "C",
    8m, "",
    11m, "D",
    12m, ""
]
;
Events
| sort by Ts asc
| scan declare (Event_filled: string="") with 
(
    step s1: true => Event_filled = iff(isempty(Event), s1.Event_filled, Event);
)

Çıkış

Ts Olay Event_filled
00:00:00 A A
00:01:00 A
00:02:00 B B
00:03:00 B
00:04:00 B
00:06:00 C C
00:08:00 C
00:11:00 D D
00:12:00 D

Oturum etiketleme

Girişi oturumlara bölme: Oturum, oturumun ilk olayından 30 dakika sonra sona erer ve ardından yeni bir oturum başlatılır. Taramanın her ayrı eşleşmesi with_match_id (oturumu) için benzersiz bir değer atayan bayrağının kullanımına dikkat edin. Ayrıca, bu örnekteki iki adımın özel kullanımı koşuludur, inSessiontrue bu nedenle girişteki tüm kayıtları yakalar ve çıkışını oluştururken endSession , geçerli eşleşmenin değerinden 30 milyondan sessionStart fazla gerçekleşen kayıtları yakalar. Adım endSession , output=none çıkış kayıtları oluşturmadığı anlamına gelir. Bu endSession adım, geçerli eşleşmenin durumunu 'den inSession 'e ilerletmek için endSessionkullanılır ve geçerli kayıttan başlayarak yeni bir eşleşmenin (oturum) başlatılmasına izin verir.

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "A",
    2m, "B",
    3m, "D",
    32m, "B",
    36m, "C",
    38m, "D",
    41m, "E",
    75m, "A"
]
;
Events
| sort by Ts asc
| scan with_match_id=session_id declare (sessionStart: timespan) with 
(
    step inSession: true => sessionStart = iff(isnull(inSession.sessionStart), Ts, inSession.sessionStart);
    step endSession output=none: Ts - inSession.sessionStart > 30m;
)

Çıkış

Ts Olay sessionStart Session_id
00:00:00 A 00:00:00 0
00:01:00 A 00:00:00 0
00:02:00 B 00:00:00 0
00:03:00 D 00:00:00 0
00:32:00 B 00:32:00 1
00:36:00 C 00:32:00 1
00:38:00 D 00:32:00 1
00:41:00 E 00:32:00 1
01:15:00 A 01:15:00 2

Başlat ve Durdur arasındaki olaylar

Olay ile 5 dakika içinde gerçekleşen olay Start arasındaki tüm olay Stop dizilerini bulun. Her dizi için bir eşleşme kimliği atayın.

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "Start",
    2m, "B",
    3m, "D",
    4m, "Stop",
    6m, "C",
    8m, "Start",
    11m, "E",
    12m, "Stop"
]
;
Events
| sort by Ts asc
| scan with_match_id=m_id with 
(
    step s1: Event == "Start";
    step s2: Event != "Start" and Event != "Stop" and Ts - s1.Ts <= 5m;
    step s3: Event == "Stop" and Ts - s1.Ts <= 5m;
)

Çıkış

Ts Olay m_id
00:01:00 Başlangıç 0
00:02:00 B 0
00:03:00 D 0
00:04:00 Durdur 0
00:08:00 Başlangıç 1
00:11:00 E 1
00:12:00 Durdur 1

Olayların özel hunisini hesaplama

Olaylar arasındaki zamanlardaki (içinde ve içinde) özel eşiklerle sıranın bir huni tamamlanmasını Hail>Thunderstorm Wind>TornadoState hesaplayın.Tornado2hThunderstorm Wind1h Bu örnek , funnel_sequence_completion eklentisine benzer, ancak daha fazla esneklik sağlar.

StormEvents
| partition hint.strategy=native by State 
    (
    sort by StartTime asc
    | scan with 
    (
        step hail: EventType == "Hail";
        step tornado: EventType == "Tornado" and StartTime - hail.StartTime <= 1h;
        step thunderstormWind: EventType == "Thunderstorm Wind" and StartTime - tornado.StartTime <= 2h;
    )
    )
| summarize dcount(State) by EventType

Çıkış

Olay türü dcount_State
Dolu 50
Kasırga 34
Fırtına Rüzgarı 32

Tarama mantığının izlenecek yolu

Bu bölümde, başlatma ve durdurma arasındaki olaylar örneğinin adım adım izlenecek yolu kullanılarak tarama mantığı gösterilmektedir:

let Events = datatable (Ts: timespan, Event: string) [
    0m, "A",
    1m, "Start",
    2m, "B",
    3m, "D",
    4m, "Stop",
    6m, "C",
    8m, "Start",
    11m, "E",
    12m, "Stop"
]
;
Events
| sort by Ts asc
| scan with_match_id=m_id with 
(
    step s1: Event == "Start";
    step s2: Event != "Start" and Event != "Stop" and Ts - s1.Ts <= 5m;
    step s3: Event == "Stop" and Ts - s1.Ts <= 5m;
)

Durum

İşlecin durumunu, her adımın scan kendi durumuna sahip olduğu her adım için bir satırı olan bir tablo olarak düşünün. Bu durum, önceki adımların ve geçerli adımın tüm sütunlarının ve bildirilen değişkenlerin en son değerlerini içerir. Daha fazla bilgi için bkz. State.

Bu örnekte durum aşağıdaki tabloyla gösterilebilir:

adım m_id s1. Ts s1. Olay s2. Ts s2. Olay s3. Ts s3. Olay
s1 X X X X
s2 X X
s3

"X" belirli bir alanın bu adım için ilgisiz olduğunu gösterir.

Eşleşen mantık

Bu bölüm, tablonun her kaydında Eventseşleşen mantığı izler ve her adımda durum ve çıkışın dönüştürülmesi açıklanır.

Not

Giriş kaydı, son adımdan () ilks1 adıma (s3 ) kadar ters sırada adımlara göre değerlendirilir.

Kayıt 1

Ts Olay
0m "A"

Her adımda değerlendirmeyi kaydedin:

  • s3: Durumu boş olduğundan s2 1'i denetleme işlemi geçirilmiyor ve Etkin bir dizi olmadığından 2'yi denetle geçirilmiyor s3 .
  • s2: Durumu boş olduğundan s1 1'i denetleme işlemi geçirilmiyor ve Etkin bir dizi olmadığından 2'yi denetle geçirilmiyor s2 .
  • s1: Önceki adım olmadığından 1'in ilgisiz olduğunu denetleyin. Kayıt koşuluna Event == "Start"uymadığından 2 denetimi geçirilmiyor. Kayıt 1 , durumu veya çıkışı etkilemeden atılır.

Durum:

adım m_id s1. Ts s1. Olay s2. Ts s2. Olay s3. Ts s3. Olay
s1 X X X X
s2 X X
s3

Kayıt 2

Ts Olay
1m "Başlat"

Her adımda değerlendirmeyi kaydedin:

  • s3: Durumu s2 boş olduğundan 1'i denetleme işlemi geçirilmiyor ve Etkin bir dizi olmadığından Denetim 2 geçirilmiyors3.
  • s2: Durumu s1 boş olduğundan 1'i denetleme işlemi geçirilmiyor ve Etkin bir dizi olmadığından Denetim 2 geçirilmiyors2.
  • s1: Önceki bir adım olmadığından 1'in ilgisiz olduğunu denetleyin. Kayıt koşulunu Event == "Start"karşıladığı için denetim 2 geçirildi. Bu eşleşme yeni bir sıra başlatır ve m_id atanır. Kayıt 2 ve onun m_id (0) durumu ve çıkış eklenir.

Durum:

adım m_id s1. Ts s1. Olay s2. Ts s2. Olay s3. Ts s3. Olay
s1 0 00:01:00 "Başlat" X X X X
s2 X X
s3

Kayıt 3

Ts Olay
2m "B"

Her adımda değerlendirmeyi kaydedin:

  • s3: Durumu s2 boş olduğundan 1'i denetleme işlemi geçirilmiyor ve Etkin bir dizi olmadığından Denetim 2 geçirilmiyors3.
  • s2: Durumu boş olduğundan s1 ve kayıt koşulunu Ts - s1.Ts < 5mkarşıladığı için 1'i denetleyin. Bu eşleşme, durumunun s1 temizlenmesine ve içindeki s1 sırasının olarak yükseltilmesine s2neden olur. Kayıt 3 ve onun m_id (0) durumu ve çıkış eklenir.
  • s1: Denetim 1'in ilgisizdir çünkü önceki adım yoktur ve Kayıt koşulunu Event == "Start"karşılamadığından 2. denetim geçirilmez.

Durum:

adım m_id s1. Ts s1. Olay s2. Ts s2. Olay s3. Ts s3. Olay
s1 X X X X
s2 0 00:01:00 "Başlat" 00:02:00 "B" X X
s3

Kayıt 4

Ts Olay
3m "D"

Her adımda değerlendirmeyi kaydedin:

  • s3: Kayıt koşulunu Event == "Stop"karşılamadığından 1 denetimi geçirilmiyor ve Etkin bir dizi olmadığından 2. Denetim geçirilmiyor.s3
  • s2: Durumus1 boş olduğundan 1 denetimi geçirilmiyor. koşulunu karşıladığı için Denetim 2'yiTs - s1.Ts < 5mgeçirir. Kayıt 4 ve onun m_id (0) durumu ve çıkış eklenir. Bu kayıttan alınan değerler ve s2.Eventiçin s2.Ts önceki durum değerlerinin üzerine yazar.
  • s1: Denetim 1'in ilgisizdir çünkü önceki adım yoktur ve Kayıt koşulunu Event == "Start"karşılamadığından 2. denetim geçirilmez.

Durum:

adım m_id s1. Ts s1. Olay s2. Ts s2. Olay s3. Ts s3. Olay
s1 X X X X
s2 0 00:01:00 "Başlat" 00:03:00 "D" X X
s3

Kayıt 5

Ts Olay
4m "Durdur"

Her adımda değerlendirmeyi kaydedin:

  • s3: Onay 1 geçirildi çünkü s2 yok ve koşulunu s3Event == "Stop"karşılıyor. Bu eşleşme, durumunun s2 temizlenmesine ve içindeki s2 sırasının olarak yükseltilmesine s3neden olur. Kayıt 5 ve onun m_id (0) durumu ve çıkış eklenir.
  • s2: Durumu s1 boş olduğundan 1'i denetleme işlemi geçirilmiyor ve Etkin bir dizi olmadığından Denetim 2 geçirilmiyors2.
  • s1: Önceki bir adım olmadığından 1'in ilgisiz olduğunu denetleyin. Kayıt koşuluna Event == "Start"uymadığından 2. denetim geçirilmiyor.

Durum:

adım m_id s1. Ts s1. Olay s2. Ts s2. Olay s3. Ts s3. Olay
s1 X X X X
s2 X X
s3 0 00:01:00 "Başlat" 00:03:00 "D" 00:04:00 "Durdur"

Kayıt 6

Ts Olay
6m "C"

Her adımda değerlendirmeyi kaydedin:

  • s3: Durumu s2 boş olduğundan denetim 1 geçirilmiyor ve Koşula Event == "Stop"uymadığından s32 denetimi geçirilmiyors3.
  • s2: Durumu s1 boş olduğundan 1'i denetleme işlemi geçirilmiyor ve Etkin bir dizi olmadığından Denetim 2 geçirilmiyors2.
  • s1: Önceki adım olmadığından 1 denetimi geçirilmiyor ve Koşulu Event == "Start"karşılamadığından 2. denetim geçirilmiyor. Kayıt 6 , durumu veya çıkışı etkilemeden atılır.

Durum:

adım m_id s1. Ts s1. Olay s2. Ts s2. Olay s3. Ts s3. Olay
s1 X X X X
s2 X X
s3 0 00:01:00 "Başlat" 00:03:00 "D" 00:04:00 "Durdur"

Kayıt 7

Ts Olay
8m "Başlat"

Her adımda değerlendirmeyi kaydedin:

  • s3: Durumu s2 boş olduğundan 1 denetimi geçirilmiyor ve Koşula Event == "Stop"uymadığından 2 denetimi geçirilmiyor.
  • s2: Durumu s1 boş olduğundan 1'i denetleme işlemi geçirilmiyor ve Etkin bir dizi olmadığından Denetim 2 geçirilmiyors2.
  • s1: Önceki adım olmadığından 1'in geçirilmiyor olduğunu denetleyin. koşulunu karşıladığı için Denetim 2'yiEvent == "Start"geçirir. Bu eşleşme, içinde yeni bir ile yeni m_idbir sıra s1 başlatır. Kayıt 7 ve onun m_id (1) durumu ve çıkış eklenir.

Durum:

adım m_id s1. Ts s1. Olay s2. Ts s2. Olay s3. Ts s3. Olay
s1 1 00:08:00 "Başlat" X X X X
s2 X X
s3 0 00:01:00 "Başlat" 00:03:00 "D" 00:04:00 "Durdur"

Not

Artık durumda iki etkin dizi vardır.

Kayıt 8

Ts Olay
11m "E"

Her adımda değerlendirmeyi kaydedin:

  • s3: Durumu boş olduğundan s21'i denetleme işlemi geçirilmiyor ve Koşulu karşılamadığından s3Event == "Stop"2'yi denetle geçirilmiyor.
  • s2: Durumu belirsiz olduğundan ve kayıt koşulunu Ts - s1.Ts < 5mkarşıladığından s11'i denetleyin. Bu eşleşme, durumunun s1 temizlenmesine ve içindeki s1 sırasının olarak yükseltilmesine s2neden olur. Kayıt 8 ve onun m_id (1) durumu ve çıkış eklenir.
  • s1: Önceki adım olmadığından 1'in ilgisiz olduğunu ve kayıt koşulunu karşılamadığından 2'yi denetleme işleminin Event == "Start"geçirilmiyor olduğunu denetleyin.

Durum:

adım m_id s1. Ts s1. Olay s2. Ts s2. Olay s3. Ts s3. Olay
s1 X X X X
s2 1 00:08:00 "Başlat" 00:11:00 "E" X X
s3 0 00:01:00 "Başlat" 00:03:00 "D" 00:04:00 "Durdur"

Kayıt 9

Ts Olay
12m "Durdur"

Her adımda değerlendirmeyi kaydedin:

  • s3: 1'in geçirildiğini denetleyin çünkü s2 yok ve koşulunu s3Event == "Stop"karşılıyor. Bu eşleşme, durumunun s2 temizlenmesine ve içindeki s2 sırasının olarak yükseltilmesine s3neden olur. Kayıt 9 ve onun m_id (1) durumu ve çıkışı eklenir.
  • s2: Durumu boş olduğundan s1 1'i denetleme işlemi geçirilmiyor ve Etkin bir dizi olmadığından 2'yi denetle geçirilmiyor s2 .
  • s1: Önceki adım olmadığından 1'i denetleme işlemi geçirilmiyor. denetim 2'yi geçirir çünkü koşuluna uygun olur Event == "Start". Bu eşleşme, içinde yeni bir ile yeni m_idbir sıra s1 başlatır.

Durum:

adım m_id s1. Ts s1. Olay s2. Ts s2. Olay s3. Ts s3. Olay
s1 X X X X
s2 X X
s3 1 00:08:00 "Başlat" 00:11:00 "E" 00:12:00 "Durdur"

Son çıkış

Ts Olay m_id
00:01:00 Başlangıç 0
00:02:00 B 0
00:03:00 D 0
00:04:00 Durdur 0
00:08:00 Başlangıç 1
00:11:00 E 1
00:12:00 Durdur 1