Typowe wzorce zapytań w usłudze Azure Stream Analytics
Zapytania w usłudze Azure Stream Analytics są wyrażane w języku zapytań przypominającym język SQL. Konstrukcje językowe są udokumentowane w przewodniku referencyjnym języka zapytań usługi Stream Analytics .
Projekt zapytania może wyrażać prostą logikę przekazywania, aby przenieść dane zdarzeń z jednego strumienia wejściowego do wyjściowego magazynu danych lub może wykonywać zaawansowane dopasowywanie wzorców i analizę czasową w celu obliczania agregacji w różnych oknach czasu, jak w przewodniku Tworzenie rozwiązania IoT przy użyciu usługi Stream Analytics . Możesz połączyć dane z wielu danych wejściowych w celu połączenia zdarzeń przesyłania strumieniowego i wykonywać wyszukiwania względem statycznych danych referencyjnych w celu wzbogacenia wartości zdarzeń. Możesz również zapisywać dane w wielu danych wyjściowych.
W tym artykule opisano rozwiązania kilku typowych wzorców zapytań opartych na rzeczywistych scenariuszach.
Obsługiwane formaty danych
Usługa Azure Stream Analytics obsługuje przetwarzanie zdarzeń w formatach danych CSV, JSON i Avro.
Zarówno JSON, jak i Avro mogą zawierać typy złożone, takie jak zagnieżdżone obiekty (rekordy) lub tablice. Aby uzyskać więcej informacji na temat pracy z tymi złożonymi typami danych, zobacz artykuł Analizowanie danych JSON i AVRO .
Wysyłanie danych do wielu danych wyjściowych
Wiele instrukcji SELECT może służyć do wyprowadzania danych do różnych ujść danych wyjściowych. Na przykład jeden element SELECT może wygenerować alert oparty na progach, podczas gdy inny może wyprowadzać zdarzenia do magazynu obiektów blob.
Dane wejściowe:
Marka | Godzina |
---|---|
Make1 | 2015-01-01T00:00:01Z |
Make1 | 2015-01-01T00:00:02Z |
Make2 | 2015-01-01T00:00:01Z |
Make2 | 2015-01-01T00:00:02Z |
Make2 | 2015-01-01T00:00:03Z |
Dane wyjściowe ArchiveOutput:
Marka | Godzina |
---|---|
Make1 | 2015-01-01T00:00:01Z |
Make1 | 2015-01-01T00:00:02Z |
Make2 | 2015-01-01T00:00:01Z |
Make2 | 2015-01-01T00:00:02Z |
Make2 | 2015-01-01T00:00:03Z |
Wyjściowy alertOutput:
Marka | Godzina | Liczba |
---|---|---|
Make2 | 2015-01-01T00:00:10Z | 3 |
Zapytanie:
SELECT
*
INTO
ArchiveOutput
FROM
Input TIMESTAMP BY Time
SELECT
Make,
System.TimeStamp() AS Time,
COUNT(*) AS [Count]
INTO
AlertOutput
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
HAVING
[Count] >= 3
Klauzula INTO informuje usługę Stream Analytics, do której dane wyjściowe mają być zapisywane. Pierwszy element SELECT definiuje zapytanie przekazywane, które odbiera dane z danych wejściowych i wysyła je do danych wyjściowych o nazwie ArchiveOutput. Drugie zapytanie wykonuje prostą agregację i filtrowanie przed wysłaniem wyników do danych wyjściowych systemu alertów podrzędnych o nazwie AlertOutput.
Należy pamiętać, że klauzula WITH może służyć do definiowania wielu bloków podzapytania. Ta opcja ma korzyść z otwierania mniejszej liczby czytników w źródle wejściowym.
Zapytanie:
WITH ReaderQuery AS (
SELECT
*
FROM
Input TIMESTAMP BY Time
)
SELECT * INTO ArchiveOutput FROM ReaderQuery
SELECT
Make,
System.TimeStamp() AS Time,
COUNT(*) AS [Count]
INTO AlertOutput
FROM ReaderQuery
GROUP BY
Make,
TumblingWindow(second, 10)
HAVING [Count] >= 3
Aby uzyskać więcej informacji, zobacz klauzulę WITH.
Proste zapytanie przekazywane
Proste zapytanie przekazywane może służyć do kopiowania danych strumienia wejściowego do danych wyjściowych. Jeśli na przykład strumień danych zawierających informacje o pojazdach w czasie rzeczywistym musi zostać zapisany w bazie danych SQL na potrzeby późniejszej analizy, proste zapytanie przekazywane wykona to zadanie.
Dane wejściowe:
Marka | Godzina | Waga |
---|---|---|
Make1 | 2015-01-01T00:00:01Z | "1000" |
Make1 | 2015-01-01T00:00:02Z | "2000" |
Dane wyjściowe:
Marka | Godzina | Waga |
---|---|---|
Make1 | 2015-01-01T00:00:01Z | "1000" |
Make1 | 2015-01-01T00:00:02Z | "2000" |
Zapytanie:
SELECT
*
INTO Output
FROM Input
Zapytanie SELECT * projektuje wszystkie pola zdarzenia przychodzącego i wysyła je do danych wyjściowych. W ten sam sposób funkcja SELECT może również służyć do projekcji tylko wymaganych pól z danych wejściowych. W tym przykładzie, jeśli pojazd Make i Time są jedynymi polami wymaganymi do zapisania, te pola można określić w instrukcji SELECT .
Dane wejściowe:
Marka | Godzina | Waga |
---|---|---|
Make1 | 2015-01-01T00:00:01Z | 1000 |
Make1 | 2015-01-01T00:00:02Z | 2000 |
Make2 | 2015-01-01T00:00:04Z | 1500 |
Dane wyjściowe:
Marka | Godzina |
---|---|
Make1 | 2015-01-01T00:00:01Z |
Make1 | 2015-01-01T00:00:02Z |
Make2 | 2015-01-01T00:00:04Z |
Zapytanie:
SELECT
Make, Time
INTO Output
FROM Input
Dopasowywanie ciągów z ciągami LIKE i NOT LIKE
LIKE i NOT LIKE można użyć do sprawdzenia, czy pole pasuje do określonego wzorca. Na przykład można utworzyć filtr, aby zwrócić tylko tablice rejestracyjne rozpoczynające się literą "A" i kończyć się cyfrą 9.
Dane wejściowe:
Marka | License_plate | Godzina |
---|---|---|
Make1 | ABC-123 | 2015-01-01T00:00:01Z |
Make2 | AAA-999 | 2015-01-01T00:00:02Z |
Make3 | ABC-369 | 2015-01-01T00:00:03Z |
Dane wyjściowe:
Marka | License_plate | Godzina |
---|---|---|
Make2 | AAA-999 | 2015-01-01T00:00:02Z |
Make3 | ABC-369 | 2015-01-01T00:00:03Z |
Zapytanie:
SELECT
*
FROM
Input TIMESTAMP BY Time
WHERE
License_plate LIKE 'A%9'
Użyj instrukcji LIKE , aby sprawdzić wartość pola License_plate . Powinna zaczynać się od litery "A", a następnie mieć dowolny ciąg zer lub więcej znaków, kończąc się cyfrą 9.
Obliczanie w poprzednich zdarzeniach
Funkcja LAG może służyć do przyjrzenia się przeszłym zdarzeniu w przedziale czasu i porównać je z bieżącym zdarzeniem. Na przykład bieżąca firma samochodowa może być wyprowadzona, jeśli różni się od ostatniego samochodu, który przeszedł przez opłaty.
Dane wejściowe:
Marka | Godzina |
---|---|
Make1 | 2015-01-01T00:00:01Z |
Make2 | 2015-01-01T00:00:02Z |
Dane wyjściowe:
Marka | Godzina |
---|---|
Make2 | 2015-01-01T00:00:02Z |
Zapytanie:
SELECT
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make
Użyj funkcji LAG , aby zajrzeć do strumienia wejściowego z powrotem jednego zdarzenia, pobierając wartość Make i porównując ją z wartością Make bieżącego zdarzenia i wyprowadzając zdarzenie.
Aby uzyskać więcej informacji, zobacz LAG.
Zwraca ostatnie zdarzenie w oknie
Ponieważ zdarzenia są używane przez system w czasie rzeczywistym, nie ma funkcji, która może określić, czy zdarzenie będzie ostatnim, który zostanie dostarczony przez ten przedział czasu. Aby to osiągnąć, strumień wejściowy musi być przyłączony do innego, w którym czas zdarzenia jest maksymalnym czasem dla wszystkich zdarzeń w tym oknie.
Dane wejściowe:
License_plate | Marka | Godzina |
---|---|---|
DXE 5291 | Make1 | 2015-07-27T00:00:05Z |
YZK 5704 | Make3 | 2015-07-27T00:02:17Z |
RMV 8282 | Make1 | 2015-07-27T00:05:01Z |
YHN 6970 | Make2 | 2015-07-27T00:06:00Z |
VFE 1616 | Make2 | 2015-07-27T00:09:31Z |
QYF 9358 | Make1 | 2015-07-27T00:12:02Z |
MDR 6128 | Utwórz 4 | 2015-07-27T00:13:45Z |
Dane wyjściowe:
License_plate | Marka | Godzina |
---|---|---|
VFE 1616 | Make2 | 2015-07-27T00:09:31Z |
MDR 6128 | Utwórz 4 | 2015-07-27T00:13:45Z |
Zapytanie:
WITH LastInWindow AS
(
SELECT
MAX(Time) AS LastEventTime
FROM
Input TIMESTAMP BY Time
GROUP BY
TumblingWindow(minute, 10)
)
SELECT
Input.License_plate,
Input.Make,
Input.Time
FROM
Input TIMESTAMP BY Time
INNER JOIN LastInWindow
ON DATEDIFF(minute, Input, LastInWindow) BETWEEN 0 AND 10
AND Input.Time = LastInWindow.LastEventTime
Pierwszym krokiem zapytania jest znalezienie maksymalnej sygnatury czasowej w 10-minutowych oknach, czyli sygnatury czasowej ostatniego zdarzenia dla tego okna. Drugi krok łączy wyniki pierwszego zapytania z oryginalnym strumieniem, aby znaleźć zdarzenie zgodne z ostatnimi sygnaturami czasu w każdym oknie.
DATEDIFF to funkcja specyficzna dla daty, która porównuje i zwraca różnicę czasu między dwoma polami DateTime, aby uzyskać więcej informacji, zobacz funkcje daty.
Aby uzyskać więcej informacji na temat dołączania strumieni, zobacz JOIN.
Agregacja danych w czasie
Aby obliczyć informacje w przedziale czasu, dane można agregować razem. W tym przykładzie liczba jest obliczana w ciągu ostatnich 10 sekund czasu dla każdego konkretnego samochodu.
Dane wejściowe:
Marka | Godzina | Waga |
---|---|---|
Make1 | 2015-01-01T00:00:01Z | 1000 |
Make1 | 2015-01-01T00:00:02Z | 2000 |
Make2 | 2015-01-01T00:00:04Z | 1500 |
Dane wyjściowe:
Marka | Liczba |
---|---|
Make1 | 2 |
Make2 | 1 |
Zapytanie:
SELECT
Make,
COUNT(*) AS Count
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Ta agregacja grupuje samochody według pozycji Make i zlicza je co 10 sekund. Dane wyjściowe mają Make and Count samochodów, które przeszły przez opłaty.
TumblingWindow to funkcja okien używana do grupowania zdarzeń. Agregacja może być stosowana we wszystkich zdarzeniach pogrupowanych. Aby uzyskać więcej informacji, zobacz funkcje okien.
Aby uzyskać więcej informacji na temat agregacji, zobacz funkcje agregujące.
Okresowo wartości wyjściowe
W przypadku nieregularnych lub brakujących zdarzeń można wygenerować regularne dane wyjściowe interwału na podstawie bardziej rozrzedzonych danych wejściowych. Na przykład generuj zdarzenie co 5 sekund, które zgłasza ostatnio widoczny punkt danych.
Dane wejściowe:
Godzina | Wartość |
---|---|
"2014-01-01T06:01:00" | 1 |
"2014-01-01T06:01:05" | 2 |
"2014-01-01T06:01:10" | 3 |
"2014-01-01T06:01:15" | 4 |
"2014-01-01T06:01:30" | 5 |
"2014-01-01T06:01:35" | 6 |
Dane wyjściowe (pierwsze 10 wierszy):
Window_end | Last_event. Czas | Last_event. Wartość |
---|---|---|
2014-01-01T14:01:00Z | 2014-01-01T14:01:00Z | 1 |
2014-01-01T14:01:05Z | 2014-01-01T14:01:05Z | 2 |
2014-01-01T14:01:10Z | 2014-01-01T14:01:10Z | 3 |
2014-01-01T14:01:15Z | 2014-01-01T14:01:15Z | 4 |
2014-01-01T14:01:20Z | 2014-01-01T14:01:15Z | 4 |
2014-01-01T14:01:25Z | 2014-01-01T14:01:15Z | 4 |
2014-01-01T14:01:30Z | 2014-01-01T14:01:30Z | 5 |
2014-01-01T14:01:35Z | 2014-01-01T14:01:35Z | 6 |
2014-01-01T14:01:40Z | 2014-01-01T14:01:35Z | 6 |
2014-01-01T14:01:45Z | 2014-01-01T14:01:35Z | 6 |
Zapytanie:
SELECT
System.Timestamp() AS Window_end,
TopOne() OVER (ORDER BY Time DESC) AS Last_event
FROM
Input TIMESTAMP BY Time
GROUP BY
HOPPINGWINDOW(second, 300, 5)
To zapytanie generuje zdarzenia co 5 sekund i generuje ostatnie zdarzenie, które zostało odebrane wcześniej. Czas trwania HOPPINGWINDOW określa, jak daleko z powrotem zapytanie szuka najnowszego zdarzenia.
Aby uzyskać więcej informacji, zobacz Okno przeskoku.
Skorelowanie zdarzeń w strumieniu
Korelowanie zdarzeń w tym samym strumieniu można wykonać, przeglądając poprzednie zdarzenia przy użyciu funkcji LAG . Na przykład dane wyjściowe można wygenerować za każdym razem, gdy dwa kolejne samochody z tego samego make przejść przez opłaty za ostatnie 90 sekund.
Dane wejściowe:
Marka | License_plate | Godzina |
---|---|---|
Make1 | ABC-123 | 2015-01-01T00:00:01Z |
Make1 | AAA-999 | 2015-01-01T00:00:02Z |
Make2 | DEF-987 | 2015-01-01T00:00:03Z |
Make1 | GHI-345 | 2015-01-01T00:00:04Z |
Dane wyjściowe:
Marka | Godzina | Current_car_license_plate | First_car_license_plate | First_car_time |
---|---|---|---|---|
Make1 | 2015-01-01T00:00:02Z | AAA-999 | ABC-123 | 2015-01-01T00:00:01Z |
Zapytanie:
SELECT
Make,
Time,
License_plate AS Current_car_license_plate,
LAG(License_plate, 1) OVER (LIMIT DURATION(second, 90)) AS First_car_license_plate,
LAG(Time, 1) OVER (LIMIT DURATION(second, 90)) AS First_car_time
FROM
Input TIMESTAMP BY Time
WHERE
LAG(Make, 1) OVER (LIMIT DURATION(second, 90)) = Make
Funkcja LAG może przyjrzeć się strumieniu wejściowemu z powrotem jedno zdarzenie i pobrać wartość Make , porównując tę wartość z wartością Make bieżącego zdarzenia. Po spełnieniu warunku dane z poprzedniego zdarzenia można projektować przy użyciu funkcji LAG w instrukcji SELECT .
Aby uzyskać więcej informacji, zobacz LAG.
Wykrywanie czasu trwania między zdarzeniami
Czas trwania zdarzenia można obliczyć, sprawdzając ostatnie zdarzenie startowe po odebraniu zdarzenia końcowego. To zapytanie może być przydatne do określenia czasu spędzanego przez użytkownika na stronie lub funkcji.
Dane wejściowe:
Użytkownik | Cecha | Zdarzenie | Godzina |
---|---|---|---|
user@location.com | RightMenu | Rozpocznij | 2015-01-01T00:00:01Z |
user@location.com | RightMenu | End | 2015-01-01T00:00:08Z |
Dane wyjściowe:
Użytkownik | Cecha | Czas trwania |
---|---|---|
user@location.com | RightMenu | 7 |
Zapytanie:
SELECT
[user],
feature,
DATEDIFF(
second,
LAST(Time) OVER (PARTITION BY [user], feature LIMIT DURATION(hour, 1) WHEN Event = 'start'),
Time) as duration
FROM input TIMESTAMP BY Time
WHERE
Event = 'end'
Funkcja LAST może służyć do pobierania ostatniego zdarzenia w określonym warunku. W tym przykładzie warunek jest zdarzeniem typu Start, partycjonowaniem wyszukiwania według użytkownika i funkcji PARTITION BY . Dzięki temu każdy użytkownik i funkcja są traktowane niezależnie podczas wyszukiwania zdarzenia Start. Limit czasu trwania ogranicza czas wyszukiwania w czasie do 1 godziny między zdarzeniami Koniec i Uruchamianie.
Zlicz unikatowe wartości
Funkcja COUNT i DISTINCT może służyć do zliczenia liczby unikatowych wartości pól wyświetlanych w strumieniu w przedziale czasu. Zapytanie można utworzyć, aby obliczyć, ile unikatowych samochodów przechodzi przez kabinę opłat w 2-sekundowym oknie.
Dane wejściowe:
Marka | Godzina |
---|---|
Make1 | 2015-01-01T00:00:01Z |
Make1 | 2015-01-01T00:00:02Z |
Make2 | 2015-01-01T00:00:01Z |
Make2 | 2015-01-01T00:00:02Z |
Make2 | 2015-01-01T00:00:03Z |
Wyjście:
Count_make | Godzina |
---|---|
2 | 2015-01-01T00:00:02Z |
1 | 2015-01-01T00:00:04Z |
Zapytanie:
SELECT
COUNT(DISTINCT Make) AS Count_make,
System.TIMESTAMP() AS Time
FROM Input TIMESTAMP BY TIME
GROUP BY
TumblingWindow(second, 2)
FUNKCJA COUNT(DISTINCT Make) zwraca liczbę unikatowych wartości w kolumnie Make w przedziale czasu. Aby uzyskać więcej informacji, zobacz funkcja agregacji COUNT.
Pobieranie pierwszego zdarzenia w oknie
IsFirst może służyć do pobierania pierwszego zdarzenia w przedziale czasu. Na przykład wyprowadzanie pierwszych informacji o samochodzie w odstępie 10 minut.
Dane wejściowe:
License_plate | Marka | Godzina |
---|---|---|
DXE 5291 | Make1 | 2015-07-27T00:00:05Z |
YZK 5704 | Make3 | 2015-07-27T00:02:17Z |
RMV 8282 | Make1 | 2015-07-27T00:05:01Z |
YHN 6970 | Make2 | 2015-07-27T00:06:00Z |
VFE 1616 | Make2 | 2015-07-27T00:09:31Z |
QYF 9358 | Make1 | 2015-07-27T00:12:02Z |
MDR 6128 | Utwórz 4 | 2015-07-27T00:13:45Z |
Dane wyjściowe:
License_plate | Marka | Godzina |
---|---|---|
DXE 5291 | Make1 | 2015-07-27T00:00:05Z |
QYF 9358 | Make1 | 2015-07-27T00:12:02Z |
Zapytanie:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) = 1
IsFirst może również podzielić dane na partycje i obliczyć pierwsze zdarzenie dla każdego konkretnego samochodu Make znalezionego co 10-minutowy interwał.
Dane wyjściowe:
License_plate | Marka | Godzina |
---|---|---|
DXE 5291 | Make1 | 2015-07-27T00:00:05Z |
YZK 5704 | Make3 | 2015-07-27T00:02:17Z |
YHN 6970 | Make2 | 2015-07-27T00:06:00Z |
QYF 9358 | Make1 | 2015-07-27T00:12:02Z |
MDR 6128 | Utwórz 4 | 2015-07-27T00:13:45Z |
Zapytanie:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) OVER (PARTITION BY Make) = 1
Aby uzyskać więcej informacji, zobacz IsFirst.
Usuwanie zduplikowanych zdarzeń w oknie
Podczas wykonywania operacji, takiej jak obliczanie średniej dla zdarzeń w danym przedziale czasu, należy filtrować zduplikowane zdarzenia. W poniższym przykładzie drugie zdarzenie jest duplikatem pierwszego.
Dane wejściowe:
DeviceId | Godzina | Atrybut | Wartość |
---|---|---|---|
1 | 2018-07-27T00:00:01Z | Temperatura | 50 |
1 | 2018-07-27T00:00:01Z | Temperatura | 50 |
2 | 2018-07-27T00:00:01Z | Temperatura | 40 |
1 | 2018-07-27T00:00:05Z | Temperatura | 60 |
2 | 2018-07-27T00:00:05Z | Temperatura | 50 |
1 | 2018-07-27T00:00:10Z | Temperatura | 100 |
Dane wyjściowe:
AverageValue | DeviceId |
---|---|
70 | 1 |
45 | 2 |
Zapytanie:
With Temp AS (
SELECT
COUNT(DISTINCT Time) AS CountTime,
Value,
DeviceId
FROM
Input TIMESTAMP BY Time
GROUP BY
Value,
DeviceId,
SYSTEM.TIMESTAMP()
)
SELECT
AVG(Value) AS AverageValue, DeviceId
INTO Output
FROM Temp
GROUP BY DeviceId,TumblingWindow(minute, 5)
Funkcja COUNT(DISTINCT Time) zwraca liczbę unikatowych wartości w kolumnie Czas w przedziale czasu. Dane wyjściowe pierwszego kroku można następnie użyć do obliczenia średniej na urządzenie przez odrzucenie duplikatów.
Aby uzyskać więcej informacji, zobacz COUNT(DISTINCT Time).
Określanie logiki dla różnych przypadków/wartości (instrukcje CASE)
Instrukcje CASE mogą udostępniać różne obliczenia dla różnych pól na podstawie określonego kryterium. Na przykład przypisz pas ruchu "A" do samochodów make1 i pasa "B" do innej marki.
Dane wejściowe:
Marka | Godzina |
---|---|
Make1 | 2015-01-01T00:00:01Z |
Make2 | 2015-01-01T00:00:02Z |
Make2 | 2015-01-01T00:00:03Z |
Dane wyjściowe:
Marka | Dispatch_to_lane | Godzina |
---|---|---|
Make1 | "A" | 2015-01-01T00:00:01Z |
Make2 | "B" | 2015-01-01T00:00:02Z |
Rozwiązanie 2.
SELECT
Make
CASE
WHEN Make = "Make1" THEN "A"
ELSE "B"
END AS Dispatch_to_lane,
System.TimeStamp() AS Time
FROM
Input TIMESTAMP BY Time
Wyrażenie CASE porównuje wyrażenie z zestawem wyrażeń prostych w celu określenia jego wyniku. W tym przykładzie pojazdy make1 są wysyłane do pasa "A", podczas gdy pojazdy dowolnego innego urządzenia będą przypisywane pas "B".
Aby uzyskać więcej informacji, zobacz wyrażenie przypadku.
Konwersja danych
Dane można rzutować w czasie rzeczywistym przy użyciu metody CAST . Na przykład waga samochodu można przekonwertować z typu nvarchar(max) na typ bigint i użyć w obliczeniu liczbowym.
Dane wejściowe:
Marka | Godzina | Waga |
---|---|---|
Make1 | 2015-01-01T00:00:01Z | "1000" |
Make1 | 2015-01-01T00:00:02Z | "2000" |
Dane wyjściowe:
Marka | Waga |
---|---|
Make1 | 3000 |
Zapytanie:
SELECT
Make,
SUM(CAST(Weight AS BIGINT)) AS Weight
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Użyj instrukcji CAST , aby określić jej typ danych. Zobacz listę obsługiwanych typów danych dla typów danych (Azure Stream Analytics).
Aby uzyskać więcej informacji na temat funkcji konwersji danych.
Wykrywanie czasu trwania warunku
W przypadku warunków obejmujących wiele zdarzeń funkcja LAG może służyć do identyfikowania czasu trwania tego warunku. Załóżmy na przykład, że usterka spowodowała, że wszystkie samochody mają nieprawidłową wagę (powyżej 20 000 funtów), a czas trwania tej usterki musi zostać obliczony.
Dane wejściowe:
Marka | Godzina | Waga |
---|---|---|
Make1 | 2015-01-01T00:00:01Z | 2000 |
Make2 | 2015-01-01T00:00:02Z | 25 000 |
Make1 | 2015-01-01T00:00:03Z | 26000 |
Make2 | 2015-01-01T00:00:04Z | 25 000 |
Make1 | 2015-01-01T00:00:05Z | 26000 |
Make2 | 2015-01-01T00:00:06Z | 25 000 |
Make1 | 2015-01-01T00:00:07Z | 26000 |
Make2 | 2015-01-01T00:00:08Z | 2000 |
Dane wyjściowe:
Start_fault | End_fault |
---|---|
2015-01-01T00:00:02Z | 2015-01-01T00:00:07Z |
Zapytanie:
WITH SelectPreviousEvent AS
(
SELECT
*,
LAG([time]) OVER (LIMIT DURATION(hour, 24)) as previous_time,
LAG([weight]) OVER (LIMIT DURATION(hour, 24)) as previous_weight
FROM input TIMESTAMP BY [time]
)
SELECT
LAG(time) OVER (LIMIT DURATION(hour, 24) WHEN previous_weight < 20000 ) [Start_fault],
previous_time [End_fault]
FROM SelectPreviousEvent
WHERE
[weight] < 20000
AND previous_weight > 20000
Pierwsza instrukcja SELECT koreluje bieżącą miarę wagi z poprzednią miarą, wyświetlając ją wraz z bieżącą miarą. Drugi element SELECT powraca do ostatniego zdarzenia, w którym previous_weight jest mniejsza niż 20000, gdzie bieżąca waga jest mniejsza niż 20000, a previous_weight bieżącego zdarzenia był większy niż 20000.
End_fault jest bieżącym zdarzeniem, w którym poprzednie zdarzenie było uszkodzone, a Start_fault jest ostatnim zdarzeniem, które nie jest wadliwe.
Przetwarzanie zdarzeń z niezależnym czasem (podstreamy)
Zdarzenia mogą pojawiać się późno lub poza kolejnością z powodu niesymetryczności zegara między producentami zdarzeń, niesymetryczności zegara między partycjami lub opóźnieniami sieci. Na przykład zegar urządzenia dla TollID 2 wynosi pięć sekund za TollID 1, a zegar urządzenia dla TollID 3 wynosi dziesięć sekund za TollID 1. Obliczenia mogą być wykonywane niezależnie dla każdego opłaty, biorąc pod uwagę tylko własne dane zegara jako znacznik czasu.
Dane wejściowe:
LicensePlate | Marka | Godzina | Identyfikator opłaty płatnej |
---|---|---|---|
DXE 5291 | Make1 | 2015-07-27T00:00:01Z | 1 |
YHN 6970 | Make2 | 2015-07-27T00:00:05Z | 1 |
QYF 9358 | Make1 | 2015-07-27T00:00:01Z | 2 |
GXF 9462 | Make3 | 2015-07-27T00:00:04Z | 2 |
VFE 1616 | Make2 | 2015-07-27T00:00:10Z | 1 |
RMV 8282 | Make1 | 2015-07-27T00:00:03Z | 3 |
MDR 6128 | Make3 | 2015-07-27T00:00:11Z | 2 |
YZK 5704 | Utwórz 4 | 2015-07-27T00:00:07Z | 3 |
Dane wyjściowe:
Identyfikator opłaty płatnej | Liczba |
---|---|
1 | 2 |
2 | 2 |
1 | 1 |
3 | 1 |
2 | 1 |
3 | 1 |
Zapytanie:
SELECT
TollId,
COUNT(*) AS Count
FROM input
TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId
Klauzula TIMESTAMP OVER BY sprawdza niezależnie każdą oś czasu urządzenia przy użyciu podstreams. Zdarzenie wyjściowe dla każdego identyfikatora TollID jest generowane w miarę ich obliczania, co oznacza, że zdarzenia są uporządkowane w odniesieniu do każdego identyfikatora TollID zamiast zmiany kolejności tak, jakby wszystkie urządzenia znajdowały się na tym samym zegarze.
Aby uzyskać więcej informacji, zobacz TIMESTAMP BY OVER.
Okna sesji
Okno sesji to okno, które ciągle rozwija się w miarę występowania zdarzeń i zamyka obliczenia, jeśli żadne zdarzenie nie zostanie odebrane po określonym czasie lub jeśli okno osiągnie maksymalny czas trwania. To okno jest szczególnie przydatne podczas przetwarzania danych interakcji użytkownika. Okno rozpoczyna się, gdy użytkownik rozpoczyna interakcję z systemem i zamyka się, gdy nie zaobserwowano więcej zdarzeń, co oznacza, że użytkownik przestał wchodzić w interakcję. Na przykład użytkownik wchodzi w interakcję ze stroną internetową, na której jest rejestrowana liczba kliknięć, można użyć okna sesji, aby dowiedzieć się, jak długo użytkownik wchodził w interakcję z witryną.
Dane wejściowe:
User_id | Godzina | Adres URL |
---|---|---|
0 | 2017-01-26T00:00:00Z | "www.example.com/a.html" |
0 | 2017-01-26T00:00:20Z | "www.example.com/b.html" |
1 | 2017-01-26T00:00:55Z | "www.example.com/c.html" |
0 | 2017-01-26T00:01:10Z | "www.example.com/d.html" |
1 | 2017-01-26T00:01:15Z | "www.example.com/e.html" |
Dane wyjściowe:
User_id | StartTime | EndTime | Duration_in_seconds |
---|---|---|---|
0 | 2017-01-26T00:00:00Z | 2017-01-26T00:01:10Z | 70 |
1 | 2017-01-26T00:00:55Z | 2017-01-26T00:01:15Z | 20 |
Zapytanie:
SELECT
user_id,
MIN(time) as StartTime,
MAX(time) as EndTime,
DATEDIFF(second, MIN(time), MAX(time)) AS duration_in_seconds
FROM input TIMESTAMP BY time
GROUP BY
user_id,
SessionWindow(minute, 1, 60) OVER (PARTITION BY user_id)
Funkcja SELECT projektuje dane istotne dla interakcji użytkownika wraz z czasem trwania interakcji. Grupowanie danych według użytkownika i sesjiWindow , które zamyka się, jeśli żadna interakcja nie nastąpi w ciągu 1 minuty, z maksymalnym rozmiarem okna wynoszącym 60 minut.
Aby uzyskać więcej informacji na temat sesjiWindow, zobacz Okno sesji .
Rozszerzalność języka za pomocą funkcji zdefiniowanej przez użytkownika w językach JavaScript i C #
Język zapytań usługi Azure Stream Analytics można rozszerzyć za pomocą funkcji niestandardowych napisanych w języku JavaScript lub C#. Funkcje zdefiniowane przez użytkownika (UDF) to niestandardowe/złożone obliczenia, których nie można łatwo wyrazić przy użyciu języka SQL . Te funkcje zdefiniowane przez użytkownika można definiować raz i używać wiele razy w zapytaniu. Na przykład funkcja zdefiniowana przez użytkownika może służyć do konwertowania wartości szesnastkowej nvarchar(max) na wartość bigint .
Dane wejściowe:
Device_id | Wartość szesnastkowy |
---|---|
1 | "B4" |
2 | "11B" |
3 | "121" |
Dane wyjściowe:
Device_id | Liczba dziesiętna |
---|---|
1 | 180 |
2 | 283 |
3 | 289 |
function hex2Int(hexValue){
return parseInt(hexValue, 16);
}
public static class MyUdfClass {
public static long Hex2Int(string hexValue){
return int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
}
}
SELECT
Device_id,
udf.Hex2Int(HexValue) AS Decimal
From
Input
Funkcja User-Defined oblicza wartość bigint z wartości HexValue dla każdego używanego zdarzenia.
Aby uzyskać więcej informacji, zobacz JavaScript i C#.
Zaawansowane dopasowywanie wzorca przy użyciu MATCH_RECOGNIZE
MATCH_RECOGNIZE to zaawansowany mechanizm dopasowywania wzorców, który może służyć do dopasowywania sekwencji zdarzeń do dobrze zdefiniowanego wzorca wyrażeń regularnych. Na przykład usługa ATM jest monitorowana w czasie rzeczywistym pod kątem awarii, podczas działania usługi ATM, jeśli istnieją dwa kolejne komunikaty ostrzegawcze, administrator musi zostać powiadomiony.
Dane wejściowe:
ATM_id | Operation_id | Return_Code | Godzina |
---|---|---|---|
1 | "Wprowadzanie pinezki" | "Sukces" | 2017-01-26T00:10:00Z |
2 | "Otwarcie gniazda pieniędzy" | "Sukces" | 2017-01-26T00:10:07Z |
2 | "Zamknięcie gniazda pieniędzy" | "Sukces" | 2017-01-26T00:10:11Z |
1 | "Wprowadzanie ilości wycofania" | "Sukces" | 2017-01-26T00:10:08Z |
1 | "Otwarcie gniazda pieniędzy" | "Ostrzeżenie" | 2017-01-26T00:10:14Z |
1 | "Drukowanie salda bankowego" | "Ostrzeżenie" | 2017-01-26T00:10:19Z |
Dane wyjściowe:
ATM_id | First_Warning_Operation_id | Warning_Time |
---|---|---|
1 | "Otwarcie gniazda pieniędzy" | 2017-01-26T00:10:14Z |
SELECT *
FROM input TIMESTAMP BY time OVER ATM_id
MATCH_RECOGNIZE (
LIMIT DURATION(minute, 1)
PARTITION BY ATM_id
MEASURES
First(Warning.ATM_id) AS ATM_id,
First(Warning.Operation_Id) AS First_Warning_Operation_id,
First(Warning.Time) AS Warning_Time
AFTER MATCH SKIP TO NEXT ROW
PATTERN (Success+ Warning{2,})
DEFINE
Success AS Succes.Return_Code = 'Success',
Warning AS Warning.Return_Code <> 'Success'
) AS patternMatch
To zapytanie pasuje do co najmniej dwóch kolejnych zdarzeń awarii i generuje alarm po spełnieniu warunków. PATTERN definiuje wyrażenie regularne, które ma być używane w pasującym przypadku, w tym przypadku co najmniej dwa kolejne ostrzeżenia po co najmniej jednej pomyślnej operacji. Powodzenie i ostrzeżenie są definiowane przy użyciu wartości Return_Code i po spełnieniu warunku miary są przewidywane przy użyciu ATM_id, pierwszej operacji ostrzeżenia i pierwszego ostrzeżenia.
Aby uzyskać więcej informacji, zobacz MATCH_RECOGNIZE.
Geofencing i zapytania geoprzestrzenne
Usługa Azure Stream Analytics udostępnia wbudowane funkcje geoprzestrzenne, które mogą służyć do implementowania scenariuszy, takich jak zarządzanie flotą, udostępnianie przejazdów, połączone samochody i śledzenie zasobów. Dane geoprzestrzenne można pozyskiwać w formatach GeoJSON lub WKT w ramach strumienia zdarzeń lub danych referencyjnych. Na przykład firma, która specjalizuje się w maszynach produkcyjnych do drukowania paszportów, wynajmuje swoje maszyny rządom i konsulatom. Lokalizacja tych maszyn jest mocno kontrolowana, aby uniknąć błędnego rozplacingu i możliwego użycia do podrabiania paszportów. Każda maszyna jest wyposażona w tracker GPS, który jest przekazywany z powrotem do zadania usługi Azure Stream Analytics. Producent chce śledzić lokalizację tych maszyn i otrzymywać alerty, jeśli jeden z nich opuści autoryzowany obszar, w ten sposób może zdalnie wyłączyć, władze alertów i pobrać sprzęt.
Dane wejściowe:
Equipment_id | Equipment_current_location | Godzina |
---|---|---|
1 | "POINT(-122.1328879797982818 47.64082002051315)" | 2017-01-26T00:10:00Z |
1 | "POINT(-122.13307252987875 47.64081350934929)" | 2017-01-26T00:11:00Z |
1 | "POINT(-122.13308862313283 47.6406508603241)" | 2017-01-26T00:12:00Z |
1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00Z |
Dane wejściowe odwołań:
Equipment_id | Equipment_lease_location |
---|---|
1 | "POLYGON(-122.13326028450979 47.6409833866794,-122.13261655434621 47.640983386794,-122.13261655434621 47.64061471602751,-122.13326028450979 47.64061471602751,-122.13326028450979 47.640983386794)" |
Dane wyjściowe:
Equipment_id | Equipment_alert_location | Godzina |
---|---|---|
1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00Z |
SELECT
input.Equipment_id AS Equipment_id,
input.Equipment_current_location AS Equipment_current_location,
input.Time AS Time
FROM input TIMESTAMP BY time
JOIN
referenceInput
ON input.Equipment_id = referenceInput.Equipment_id
WHERE
ST_WITHIN(input.Equipment_currenct_location, referenceInput.Equipment_lease_location) = 1
Zapytanie umożliwia producentowi automatyczne monitorowanie lokalizacji maszyn, otrzymywanie alertów po opuszczeniu dozwolonego geofencingu przez maszynę. Wbudowana funkcja geoprzestrzenna umożliwia użytkownikom korzystanie z danych GPS w zapytaniu bez bibliotek innych firm.
Aby uzyskać więcej informacji, zobacz scenariusze agregacji geoprzestrzennych i geoprzestrzennych za pomocą usługi Azure Stream Analytics .
Uzyskaj pomoc
Aby uzyskać dalszą pomoc, wypróbuj naszą stronę pytań dotyczących języka Microsoft Q&A dotyczącą usługi Azure Stream Analytics.
Następne kroki
- Wprowadzenie do usługi Azure Stream Analytics
- Get started using Azure Stream Analytics (Rozpoczynanie pracy z usługą Azure Stream Analytics)
- Scale Azure Stream Analytics jobs (Skalowanie zadań usługi Azure Stream Analytics)
- Azure Stream Analytics Query Language Reference (Dokumentacja dotycząca języka zapytań usługi Azure Stream Analytics)
- Azure Stream Analytics Management REST API Reference (Dokumentacja interfejsu API REST zarządzania usługą Azure Stream Analytics)