Okno sesji (Azure Stream Analytics)
Zdarzenia grupy okien sesji, które docierają o podobnych porach, odfiltrowanie okresów czasu, w których nie ma danych. Funkcja okna sesji ma trzy główne parametry: limit czasu, maksymalny czas trwania i klucz partycjonowania (opcjonalnie).
Na poniższym diagramie przedstawiono strumień z serią zdarzeń i sposób ich mapowania na przedziały czasu sesji wynoszące 5 minut i maksymalny czas trwania 10 minut.
Okno sesji rozpoczyna się po wystąpieniu pierwszego zdarzenia. Jeśli w ramach określonego limitu czasu wystąpi inne zdarzenie z ostatniego pozyskanego zdarzenia, okno zostanie rozszerzone w celu uwzględnienia nowego zdarzenia. W przeciwnym razie, jeśli w limitie czasu nie wystąpią żadne zdarzenia, okno jest zamykane po przekroczeniu limitu czasu.
Jeśli zdarzenia będą nadal występować w określonym przedziale czasu, okno sesji będzie trwać do momentu osiągnięcia maksymalnego czasu trwania. Należy pamiętać, że maksymalne interwały sprawdzania czasu trwania są ustawione na taki sam rozmiar jak określony maksymalny czas trwania. Jeśli na przykład maksymalny czas trwania wynosi 10, sprawdzanie, czy okno przekracza maksymalny czas trwania, nastąpi o wartości t = 0, 10, 20, 30 itd. Oznacza to, że rzeczywisty czas trwania okna sesji może być maksymalnie dwukrotnie maksymalny.
Dlatego matematycznie nasze okno sesji kończy się, jeśli spełniony jest następujący warunek:
Po podaniu klucza partycji zdarzenia są grupowane razem według klucza, a okno sesji jest stosowane do każdej grupy niezależnie. Jest to przydatne w przypadku, gdy potrzebujesz różnych okien sesji dla różnych użytkowników lub urządzeń.
Składnia
{SESSIONWINDOW | SESSION} (timeunit, timeoutSize, maxDurationSize) [OVER (PARTITION BY partitionKey)]
{SESSIONWINDOW | SESSION} (Timeout(timeunit , timeoutSize), MaxDuration(timeunit, maxDurationSize)) [OVER (PARTITION BY partitionKey)]
Uwaga
Okno sesji może być używane na dwa sposoby.
Argumenty
timeunit Jest jednostką czasu dla windowsize. W poniższej tabeli wymieniono wszystkie prawidłowe argumenty timeunit.
Timeunit | Skróty |
---|---|
dzień | dd, d |
godzina | hh |
minuta | mi, n |
sekunda | ss, s |
Milisekundy | Pani |
mikrosekundy | Mcs |
limit czasu
Duża liczba całkowita, która opisuje rozmiar luki w oknie sesji. Dane występujące w obrębie rozmiaru luki są grupowane razem w tym samym oknie.
maxdurationsize
Jeśli łączny rozmiar okna przekracza określony parametr maxDurationSize w punkcie kontrolnym, okno zostanie zamknięte i zostanie otwarte nowe okno w tym samym punkcie. Obecnie rozmiar interwału sprawdzania jest równy maxDurationSize.
partitionkey
Opcjonalny parametr określający klucz, nad którym działa okno sesji. Jeśli zostanie określony, okno grupuje tylko zdarzenia tego samego klucza.
Przykłady
Załóżmy, że masz następujące dane JSON:
[
// time: the timestamp when the user clicks on the link
// user_id: the id of the user
// url: the url the user clicked on
{
"time": "2017-01-26T00:00:00.0000000z",
"user_id": 0,
"url": "www.example.com/a.html"
},
{
"time": "2017-01-26T00:00:20.0000000z",
"user_id": 0,
"url": "www.example.com/b.html"
},
{
"time": "2017-01-26T00:00:55.0000000z",
"user_id": 1,
"url": "www.example.com/c.html"
},
// ...
]
Aby zmierzyć, jak długo są sesje poszczególnych użytkowników, możesz użyć następującego zapytania:
CREATE TABLE localinput(time DATETIME, user_id BIGINT, url NVARCHAR(MAX))
SELECT
user_id,
MIN(time) AS window_start,
System.Timestamp() AS window_end,
DATEDIFF(s, MIN(time), System.Timestamp()) AS duration_in_seconds
FROM localinput TIMESTAMP BY time
GROUP BY user_id, SessionWindow(minute, 2, 60) OVER (PARTITION BY user_id)
Poprzednie zapytanie tworzy okno sesji z limitem czasu wynoszącym 2 minuty, maksymalny czas trwania 60 minut i klucz partycjonowania user_id. Oznacza to, że dla każdego user_id zostaną utworzone niezależne okna sesji. Dla każdego okna to zapytanie wygeneruje dane wyjściowe zawierające user_id, godzinę rozpoczęcia okna (window_start), koniec okna (window_end) i całkowity czas trwania sesji użytkownika (duration_in_seconds).