Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Fabric Eventstream basiert auf derselben Laufzeit wie Azure Stream Analytics. Daher gelten die in diesem Artikel erläuterten Konzepte sowohl für Azure Stream Analytics als auch für den Fabric Eventstream.
Abfragen in Azure Stream Analytics werden in einer SQL-ähnlichen Abfragesprache ausgedrückt. Die Sprachkonstrukte werden im Referenzhandbuch zur Stream Analytics-Abfragesprache dokumentiert.
Das Abfragedesign kann einfache Pass-Through-Logik ausdrücken, um Ereignisdaten aus einem Eingabedatenstrom in einen Ausgabedatenspeicher zu verschieben, oder es kann umfangreiche Musterübereinstimmungen und zeitliche Analysen durchführen, um Aggregate über verschiedene Zeitfenster wie in der Build einer IoT-Lösung mithilfe des Stream Analytics-Leitfadens zu berechnen. Sie können Daten aus mehreren Eingaben verknüpfen, um Streamingereignisse zu kombinieren, und Sie können Nachschlagevorgänge anhand statischer Referenzdaten durchführen, um die Ereigniswerte zu erweitern. Sie können auch Daten in mehrere Ausgaben schreiben.
In diesem Artikel werden Lösungen für mehrere gängige Abfragemuster basierend auf realen Szenarien beschrieben.
Unterstützte Datenformate
Azure Stream Analytics unterstützt verarbeitungsereignisse in CSV-, JSON- und Avro-Datenformaten. Die JSON- und Avro-Formate können komplexe Typen wie geschachtelte Objekte (Datensätze) oder Arrays enthalten. Weitere Informationen zum Arbeiten mit diesen komplexen Datentypen finden Sie unter Analysieren von JSON- und AVRO-Daten.
Senden von Daten an mehrere Ziele
Mehrere SELECT-Anweisungen können verwendet werden, um Daten an verschiedene Ausgabesenken auszugeben. Beispielsweise kann eine SELECT-Anweisung eine schwellenwertbasierte Warnung ausgeben, während eine andere Ereignisse in einen BLOB-Speicher ausgeben kann.
Berücksichtigen Sie die folgenden Eingaben:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |
Außerdem möchten Sie die folgenden beiden Ausgaben aus der Abfrage erhalten:
ArchiveOutput:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |
AlertOutput:
| Make | Time | Count |
| --- | --- | --- |
| Make2 |2023-01-01T00:00:10.0000000Z |3 |
Abfrage mit zwei SELECT-Anweisungen mit Archivausgabe und Warnungsausgabe als Ausgaben:
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
Die INTO-Klausel teilt dem Stream Analytics-Dienst mit, in welchen der Ausgaben die Daten geschrieben werden sollen. Die erste SELECT definiert eine Pass-Through-Abfrage, die Daten von der Eingabe empfängt und an die Ausgabe mit dem Namen ArchiveOutput sendet. Die zweite Abfrage aggregiert und filtert Daten, bevor die Ergebnisse an eine nachgeschaltete Warnungssystemausgabe namens AlertOutput gesendet werden.
Die WITH-Klausel kann verwendet werden, um mehrere Unterabfrageblöcke zu definieren. Diese Option hat den Vorteil, dass weniger Leser mit der Eingabequelle interagieren müssen.
Abfrage:
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
Weitere Informationen finden Sie unter WITH-Klausel.
Einfache Pass-Through-Abfrage
Eine einfache Weiterleitungsabfrage kann verwendet werden, um den Eingabestream in die Ausgabe zu kopieren. Wenn beispielsweise ein Datenstrom, der Echtzeit-Fahrzeuginformationen enthält, in einer SQL-Datenbank zur späteren Analyse gespeichert werden muss, übernimmt eine einfache Pass-Through-Abfrage diese Aufgabe.
Berücksichtigen Sie die folgenden Eingaben:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |
Sie möchten, dass die Ausgabe mit der Eingabe identisch ist:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |
Hier ist die Abfrage:
SELECT
*
INTO Output
FROM Input
Diese SELECT * Abfrage projiziert alle Felder eines eingehenden Ereignisses und sendet sie an den Ausgang. Stattdessen können Sie nur die erforderlichen Felder in einer SELECT-Anweisung projizieren. Im folgenden Beispiel projiziert die SELECT-Anweisung nur die Felder "Make " und "Time " aus den Eingabedaten.
Berücksichtigen Sie die folgenden Eingaben:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |1000 |
| Make1 |2023-01-01T00:00:02.0000000Z |2000 |
| Make2 |2023-01-01T00:00:04.0000000Z |1500 |
Sie möchten, dass die Ausgabe nur die Felder "Make" und "Time" enthält:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:04.0000000Z |
Hier ist die Abfrage , die nur die erforderlichen Felder projiziert:
SELECT
Make, Time
INTO Output
FROM Input
Zeichenfolgenabgleich mit LIKE und NOT LIKE
LIKE und NOT LIKE können verwendet werden, um zu überprüfen, ob ein Feld einem bestimmten Muster entspricht. Sie können z. B. einen Filter verwenden, um nur die Kennzeichen zurückzugeben, die mit dem Buchstaben A beginnen und mit der Nummer 9enden.
Berücksichtigen Sie die folgenden Eingaben:
| Make | License_plate | Time |
| --- | --- | --- |
| Make1 |ABC-123 |2023-01-01T00:00:01.0000000Z |
| Make2 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make3 |ABC-369 |2023-01-01T00:00:03.0000000Z |
Sie möchten, dass die Ausgabe die Kennzeichen enthält, die mit dem Buchstaben A beginnen und mit der Nummer 9enden:
| Make | License_plate | Time |
| --- | --- | --- |
| Make2 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make3 |ABC-369 |2023-01-01T00:00:03.0000000Z |
Hier sehen Sie eine Abfrage , die den LIKE-Operator verwendet:
SELECT
*
FROM
Input TIMESTAMP BY Time
WHERE
License_plate LIKE 'A%9'
Verwenden Sie die LIKE-Anweisung , um den License_plate Feldwert zu überprüfen. Sie sollte mit dem Buchstaben Abeginnen und dann eine beliebige Zeichenfolge mit null oder mehr Zeichen enthalten, die mit der Zahl 9 enden.
Berechnung über vergangene Ereignisse
Die LAG-Funktion kann verwendet werden, um vergangene Ereignisse innerhalb eines Zeitfensters zu betrachten und mit dem aktuellen Ereignis zu vergleichen. Wenn sich die Marke des aktuellen Autos von der Marke des letzten Autos, das durch die Mautstelle gefahren ist, unterscheidet, kann sie angezeigt werden.
Beispieleingabe:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
Beispielausgabe:
| Make | Time |
| --- | --- |
| Make2 |2023-01-01T00:00:02.0000000Z |
Beispielabfrage:
SELECT
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make
Verwenden Sie LAG , um wieder in den Eingabedatenstrom ein Ereignis einzugeben, den Make-Wert abzurufen und ihn mit dem Make-Wert des aktuellen Ereignisses zu vergleichen und das Ereignis auszugeben.
Weitere Informationen finden Sie unter LAG.
Zurückgeben des letzten Ereignisses in einem Fenster
Da Ereignisse vom System in Echtzeit genutzt werden, gibt es keine Funktion, die bestimmen kann, ob ein Ereignis der letzte ist, der für dieses Zeitfenster eintrifft. Um dies zu erreichen, muss der Eingabedatenstrom mit einem anderen verknüpft werden, wobei der Zeitpunkt eines Ereignisses die maximale Zeit für alle Ereignisse in diesem Fenster ist.
Beispieleingabe:
| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| RMV 8282 |Make1 |2023-07-27T00:05:01.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |
Beispielausgabe mit Informationen über die letzten Autos in zwei Zehn-Minuten-Zeitfenstern:
| License_plate | Make | Time |
| --- | --- | --- |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |
Beispielabfrage:
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
Der erste Schritt in der Abfrage findet den maximalen Zeitstempel in 10-Minuten-Fenstern, d. h. den Zeitstempel des letzten Ereignisses für dieses Fenster. Im zweiten Schritt werden die Ergebnisse der ersten Abfrage mit dem ursprünglichen Datenstrom verknüpft, um das Ereignis zu finden, das mit den letzten Zeitstempeln in jedem Fenster übereinstimmt.
DATEDIFF ist eine datumsspezifische Funktion, die die Zeitdifferenz zwischen zwei DateTime-Feldern vergleicht und zurückgibt. Weitere Informationen finden Sie unter Datumsfunktionen.
Weitere Informationen zum Verknüpfen von Streams finden Sie unter JOIN.
Datenaggregation im Laufe der Zeit
Um Informationen über ein Zeitfenster zu berechnen, können Sie die Daten aggregieren. In diesem Beispiel berechnet die Anweisung einen Zähler über die letzten 10 Sekunden für jede spezifische Automarke.
Beispieleingabe:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |1000 |
| Make1 |2023-01-01T00:00:02.0000000Z |2000 |
| Make2 |2023-01-01T00:00:04.0000000Z |1500 |
Beispielausgabe:
| Make | Count |
| --- | --- |
| Make1 | 2 |
| Make2 | 1 |
Abfrage:
SELECT
Make,
COUNT(*) AS Count
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Diese Aggregation gruppiert die Autos nach Make und zählt sie alle 10 Sekunden. Die Ausgabe enthält die Marke und Anzahl der Autos, die durch die Mautstelle gefahren sind.
TumblingWindow ist eine Fensterfunktion, die zum Gruppieren von Ereignissen verwendet wird. Eine Aggregation kann auf alle gruppierten Ereignisse angewendet werden. Weitere Informationen finden Sie unter Fensterfunktionen.
Weitere Informationen zur Aggregation finden Sie unter Aggregatfunktionen.
Ausgabewerte in regelmäßigen Abständen
Wenn Ereignisse fehlen oder unregelmäßig sind, kann eine reguläre Intervallausgabe aus einer geringeren Dateneingabe generiert werden. Generieren Sie beispielsweise alle 5 Sekunden ein Ereignis, das den zuletzt angezeigten Datenpunkt meldet.
Beispieleingabe:
| Time | Value |
| --- | --- |
| "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 |
Beispielausgabe (erste 10 Zeilen):
| Window_end | Last_event.Time | Last_event.Value |
| --- | --- | --- |
| 2014-01-01T14:01:00.000Z |2014-01-01T14:01:00.000Z |1 |
| 2014-01-01T14:01:05.000Z |2014-01-01T14:01:05.000Z |2 |
| 2014-01-01T14:01:10.000Z |2014-01-01T14:01:10.000Z |3 |
| 2014-01-01T14:01:15.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:20.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:25.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:30.000Z |2014-01-01T14:01:30.000Z |5 |
| 2014-01-01T14:01:35.000Z |2014-01-01T14:01:35.000Z |6 |
| 2014-01-01T14:01:40.000Z |2014-01-01T14:01:35.000Z |6 |
| 2014-01-01T14:01:45.000Z |2014-01-01T14:01:35.000Z |6 |
Beispielabfrage:
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)
Diese Abfrage generiert alle 5 Sekunden Ereignisse und gibt das letzte Ereignis aus, das zuvor empfangen wurde. Die HOPPINGWINDOW-Dauer bestimmt, wie weit die Abfrage nach dem neuesten Ereignis sucht.
Weitere Informationen finden Sie im Hopping Window.
Korrelieren von Ereignissen in einem Datenstrom
Das Korrelieren von Ereignissen im selben Strom kann durchgeführt werden, indem vergangene Ereignisse mit der LAG-Funktion betrachtet werden. Eine Ausgabe kann beispielsweise immer dann generiert werden, wenn zwei aufeinander folgende Autos aus derselben Marke in den letzten 90 Sekunden durch die Mautstation gehen.
Beispieleingabe:
| Make | License_plate | Time |
| --- | --- | --- |
| Make1 |ABC-123 |2023-01-01T00:00:01.0000000Z |
| Make1 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make2 |DEF-987 |2023-01-01T00:00:03.0000000Z |
| Make1 |GHI-345 |2023-01-01T00:00:04.0000000Z |
Beispielausgabe:
| Make | Time | Current_car_license_plate | First_car_license_plate | First_car_time |
| --- | --- | --- | --- | --- |
| Make1 |2023-01-01T00:00:02.0000000Z |AAA-999 |ABC-123 |2023-01-01T00:00:01.0000000Z |
Beispielabfrage:
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
Die LAG-Funktion kann den Eingabedatenstrom um ein Ereignis zurück untersuchen und den Make-Wert abrufen, wobei dieser mit dem Make-Wert des aktuellen Ereignisses verglichen wird. Sobald die Bedingung erfüllt ist, können Daten aus dem vorherigen Ereignis mithilfe von LAG in der SELECT-Anweisung projiziert werden.
Weitere Informationen finden Sie unter LAG.
Ermitteln der Dauer zwischen Ereignissen
Die Dauer eines Ereignisses kann berechnet werden, indem das letzte Startereignis betrachtet wird, nachdem ein End-Ereignis empfangen wurde. Diese Abfrage kann hilfreich sein, um die Zeit zu bestimmen, die ein Benutzer auf einer Seite oder einem Feature verbringt.
Beispieleingabe:
| User | Feature | Event | Time |
| --- | --- | --- | --- |
| user@location.com |RightMenu |Start |2023-01-01T00:00:01.0000000Z |
| user@location.com |RightMenu |End |2023-01-01T00:00:08.0000000Z |
Beispielausgabe:
| User | Feature | Duration |
| --- | --- | --- |
| user@location.com |RightMenu |7 |
Beispielabfrage:
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'
Die LAST-Funktion kann verwendet werden, um das letzte Ereignis innerhalb einer bestimmten Bedingung abzurufen. In diesem Beispiel ist die Bedingung ein Ereignis vom Typ "Start", wobei die Suche nach Benutzer und Merkmal mittels PARTITION BY aufgeteilt wird. Auf diese Weise werden alle Benutzer und Features unabhängig behandelt, wenn Sie nach dem Startereignis suchen. LIMIT DURATION begrenzt die rückwirkende Suche auf 1 Stunde zwischen den End- und Startereignissen.
Eindeutige Werte zählen
COUNT und DISTINCT können verwendet werden, um die Anzahl eindeutiger Feldwerte zu zählen, die innerhalb eines Zeitfensters im Datenstrom angezeigt werden. Sie können eine Abfrage erstellen, um zu berechnen, wie viele eindeutige Autos in einem Zwei-Sekunden-Fenster durch den Mautstand gegangen sind.
Beispieleingabe:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |
Beispielausgabe:
| Count_make | Time |
| --- | --- |
| 2 |2023-01-01T00:00:02.000Z |
| 1 |2023-01-01T00:00:04.000Z |
Beispielabfrage:
SELECT
COUNT(DISTINCT Make) AS Count_make,
System.TIMESTAMP() AS Time
FROM Input TIMESTAMP BY TIME
GROUP BY
TumblingWindow(second, 2)
COUNT(DISTINCT Make) gibt die Anzahl unterschiedlicher Werte in der Spalte "Make " innerhalb eines Zeitfensters zurück. Weitere Informationen finden Sie unter COUNT-Aggregatfunktion.
Abrufen des ersten Ereignisses in einem Fenster
Sie können IsFirst verwenden, um das erste Ereignis in einem Zeitfenster abzurufen. Geben Sie beispielsweise die ersten Autoinformationen in jedem 10-Minuten-Intervall aus.
Beispieleingabe:
| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| RMV 8282 |Make1 |2023-07-27T00:05:01.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |
Beispielausgabe:
| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
Beispielabfrage:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) = 1
IsFirst kann die Daten auch partitionieren und das erste Ereignis für jedes spezifische Automodell berechnen, das in jedem 10-Minuten-Intervall gefunden wird.
Beispielausgabe:
| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |
Beispielabfrage:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) OVER (PARTITION BY Make) = 1
Weitere Informationen finden Sie unter IsFirst.
Entfernen doppelter Ereignisse in einem Fenster
Wenn Sie einen Vorgang ausführen, z. B. das Berechnen von Durchschnittswerten über Ereignisse in einem bestimmten Zeitfenster, sollten doppelte Ereignisse gefiltert werden. Im folgenden Beispiel ist das zweite Ereignis ein Duplikat des ersten.
Beispieleingabe:
| DeviceId | Time | Attribute | Value |
| --- | --- | --- | --- |
| 1 |2018-07-27T00:00:01.0000000Z |Temperature |50 |
| 1 |2018-07-27T00:00:01.0000000Z |Temperature |50 |
| 2 |2018-07-27T00:00:01.0000000Z |Temperature |40 |
| 1 |2018-07-27T00:00:05.0000000Z |Temperature |60 |
| 2 |2018-07-27T00:00:05.0000000Z |Temperature |50 |
| 1 |2018-07-27T00:00:10.0000000Z |Temperature |100 |
Beispielausgabe:
| AverageValue | DeviceId |
| --- | --- |
| 70 | 1 |
|45 | 2 |
Beispielabfrage:
WITH Temp AS (
SELECT 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)
Wenn die erste Anweisung ausgeführt wird, werden die doppelten Datensätze zu einem zusammengefasst, da die Felder in der GROUP BY-Klausel alle gleich sind. Daher werden die Duplikate entfernt.
Logik für unterschiedliche Fälle/Werte angeben (CASE-Anweisungen)
CASE-Anweisungen können verschiedene Berechnungen für verschiedene Felder basierend auf einem bestimmten Kriterium bereitstellen. Weisen Sie zum Beispiel die Spur A den Autos von Make1 zu und die Spur B allen anderen Marken.
Beispieleingabe:
| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |
Beispielausgabe:
| Make |Dispatch_to_lane | Time |
| --- | --- | --- |
| Make1 |"A" |2023-01-01T00:00:01.0000000Z |
| Make2 |"B" |2023-01-01T00:00:02.0000000Z |
Beispielabfrage:
SELECT
Make
CASE
WHEN Make = "Make1" THEN "A"
ELSE "B"
END AS Dispatch_to_lane,
System.TimeStamp() AS Time
FROM
Input TIMESTAMP BY Time
Der CASE-Ausdruck vergleicht einen Ausdruck mit einer Gruppe einfacher Ausdrücke, um das Ergebnis zu bestimmen. In diesem Beispiel werden Fahrzeuge der Marke Make1 auf die Fahrspur A geschickt, während Fahrzeuge anderer Marken der Fahrspur B zugewiesen werden.
Weitere Informationen finden Sie im Fallausdruck.
Datenkonvertierung
Daten können in Echtzeit mithilfe der CAST-Methode verarbeitet werden. Beispielsweise kann das Gewicht des Autos vom Typ nvarchar(max) in den Typ bigint konvertiert und in einer numerischen Berechnung verwendet werden.
Beispieleingabe:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |
Beispielausgabe:
| Make | Weight |
| --- | --- |
| Make1 |3000 |
Beispielabfrage:
SELECT
Make,
SUM(CAST(Weight AS BIGINT)) AS Weight
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Verwenden Sie eine CAST-Anweisung , um den Datentyp anzugeben. Sehen Sie sich die Liste der unterstützten Datentypen für Datentypen (Azure Stream Analytics) an.
Weitere Informationen zu Datenkonvertierungsfunktionen.
Ermitteln der Dauer einer Bedingung
Bei Bedingungen, die sich über mehrere Ereignisse erstrecken, kann die LAG-Funktion verwendet werden, um die Dauer dieser Bedingung zu identifizieren. Angenommen, ein Fehler führte dazu, dass alle Autos ein falsches Gewicht haben (über 20.000 Pfund), und die Dauer dieses Fehlers muss berechnet werden.
Beispieleingabe:
| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |2000 |
| Make2 |2023-01-01T00:00:02.0000000Z |25000 |
| Make1 |2023-01-01T00:00:03.0000000Z |26000 |
| Make2 |2023-01-01T00:00:04.0000000Z |25000 |
| Make1 |2023-01-01T00:00:05.0000000Z |26000 |
| Make2 |2023-01-01T00:00:06.0000000Z |25000 |
| Make1 |2023-01-01T00:00:07.0000000Z |26000 |
| Make2 |2023-01-01T00:00:08.0000000Z |2000 |
Beispielausgabe:
| Start_fault | End_fault |
| --- | --- |
| 2023-01-01T00:00:02.000Z |2023-01-01T00:00:07.000Z |
Beispielabfrage:
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
Die erste SELECT-Anweisung korreliert die aktuelle Gewichtsmessung mit der vorherigen Messung, wobei sie zusammen mit der aktuellen Messung projiziert wird. Die zweite SELECT Anweisung blickt auf das letzte Ereignis zurück, bei dem das vorherige Gewicht kleiner als 20000 ist, während das aktuelle Gewicht kleiner als 20000 ist und das vorherige Gewicht des aktuellen Ereignisses größer als 20000 war.
Die End_fault ist das aktuelle Nichtfaulty-Ereignis, bei dem das vorherige Ereignis fehlerhaft war, und das Start_fault ist das letzte nicht standardmäßige Ereignis davor.
Verarbeitung von Ereignissen mit unabhängigen Zeitfenstern (Substreams)
Ereignisse können aufgrund von Uhrabweichungen zwischen Ereignisproduzenten, Uhrabweichungen zwischen Partitionen oder Netzwerklatenz verspätet eintreffen oder außer der Reihenfolge kommen. Beispielsweise beträgt die Geräteuhr für TollID 2 fünf Sekunden hinter TollID 1, und die Geräteuhr für TollID 3 beträgt 10 Sekunden hinter TollID 1. Eine Berechnung kann unabhängig für jede Maut erfolgen, wobei nur deren eigene Taktdaten als Zeitstempel berücksichtigt werden.
Beispieleingabe:
| LicensePlate | Make | Time | TollID |
| --- | --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:01.0000000Z | 1 |
| YHN 6970 |Make2 |2023-07-27T00:00:05.0000000Z | 1 |
| QYF 9358 |Make1 |2023-07-27T00:00:01.0000000Z | 2 |
| GXF 9462 |Make3 |2023-07-27T00:00:04.0000000Z | 2 |
| VFE 1616 |Make2 |2023-07-27T00:00:10.0000000Z | 1 |
| RMV 8282 |Make1 |2023-07-27T00:00:03.0000000Z | 3 |
| MDR 6128 |Make3 |2023-07-27T00:00:11.0000000Z | 2 |
| YZK 5704 |Make4 |2023-07-27T00:00:07.0000000Z | 3 |
Beispielausgabe:
| TollID | Count |
| --- | --- |
| 1 | 2 |
| 2 | 2 |
| 1 | 1 |
| 3 | 1 |
| 2 | 1 |
| 3 | 1 |
Beispielabfrage:
SELECT
TollId,
COUNT(*) AS Count
FROM input
TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId
Die TIMESTAMP OVER BY-Klausel betrachtet jede Gerätezeitachse unabhängig mithilfe von Substreams. Das Ausgabeereignis für jede TollID wird generiert, während sie berechnet werden, was bedeutet, dass die Ereignisse in Bezug auf jede TollID sortiert werden, anstatt neu angeordnet zu werden, als ob alle Geräte auf derselben Uhr waren.
Weitere Informationen finden Sie unter TIMESTAMP BY OVER.
Sitzungsfenster
Ein Sitzungsfenster ist ein Fenster, das immer größer wird, wenn Ereignisse auftreten und für die Berechnung geschlossen werden, wenn kein Ereignis nach einer bestimmten Zeitspanne empfangen wird oder wenn das Fenster seine maximale Dauer erreicht. Dieses Fenster ist besonders hilfreich beim Berechnen von Benutzerinteraktionsdaten. Ein Fenster beginnt, wenn ein Benutzer mit der Interaktion mit dem System beginnt und geschlossen wird, wenn keine weiteren Ereignisse beobachtet werden, was bedeutet, dass der Benutzer nicht mehr interagiert hat. Beispielsweise interagiert ein Benutzer mit einer Webseite, auf der die Anzahl der Klicks protokolliert wird, ein Sitzungsfenster kann verwendet werden, um herauszufinden, wie lange der Benutzer mit der Website interagiert hat.
Beispieleingabe:
| User_id | Time | URL |
| --- | --- | --- |
| 0 | 2017-01-26T00:00:00.0000000Z | "www.example.com/a.html" |
| 0 | 2017-01-26T00:00:20.0000000Z | "www.example.com/b.html" |
| 1 | 2017-01-26T00:00:55.0000000Z | "www.example.com/c.html" |
| 0 | 2017-01-26T00:01:10.0000000Z | "www.example.com/d.html" |
| 1 | 2017-01-26T00:01:15.0000000Z | "www.example.com/e.html" |
Beispielausgabe:
| User_id | StartTime | EndTime | Duration_in_seconds |
| --- | --- | --- | --- |
| 0 | 2017-01-26T00:00:00.0000000Z | 2017-01-26T00:01:10.0000000Z | 70 |
| 1 | 2017-01-26T00:00:55.0000000Z | 2017-01-26T00:01:15.0000000Z | 20 |
Beispielabfrage:
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)
Der SELECT-Befehl projiziert die Daten, welche für die Benutzerinteraktion relevant sind, zusammen mit der Dauer der Interaktion. Gruppieren der Daten nach Benutzer und einer SessionWindow , die geschlossen wird, wenn keine Interaktion innerhalb von 1 Minute erfolgt, mit einer maximalen Fenstergröße von 60 Minuten.
Weitere Informationen zu SessionWindow finden Sie im Sitzungsfenster .
Benutzerdefinierte Funktionen in JavaScript und C#
Hinweis
Dieser Abschnitt gilt nicht für Fabric Eventstream.
Azure Stream Analytics-Abfragesprache kann mit benutzerdefinierten Funktionen erweitert werden, die entweder in JavaScript oder C# geschrieben wurden. Benutzerdefinierte Funktionen (User Defined Functions, UDF) sind benutzerdefinierte/komplexe Berechnungen, die nicht einfach mithilfe der SQL-Sprache ausgedrückt werden können. Diese UDFs können einmal definiert und mehrmals innerhalb einer Abfrage verwendet werden. Beispielsweise kann eine UDF verwendet werden, um einen hexadezimalen nvarchar(max) -Wert in einen Bigint-Wert zu konvertieren.
Beispieleingabe:
| Device_id | HexValue |
| --- | --- |
| 1 | "B4" |
| 2 | "11B" |
| 3 | "121" |
Beispielausgabe:
| Device_id | Decimal |
| --- | --- |
| 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
Die benutzerdefinierte Funktion berechnet den Bigint-Wert aus dem HexValue für jedes erfasste Ereignis.
Weitere Informationen finden Sie unter JavaScript und C#.
Erweiterte Musterabgleich mit MATCH_RECOGNIZE
MATCH_RECOGNIZE ist ein erweiterter Musterabgleichsmechanismus, der verwendet werden kann, um eine Abfolge von Ereignissen mit einem klar definierten Muster für reguläre Ausdrücke abzugleichen. Ein ATM wird beispielsweise während des Betriebs des ATM in Echtzeit auf Fehler überwacht, wenn zwei aufeinander folgende Warnmeldungen vorhanden sind, muss der Administrator benachrichtigt werden.
Eingabe:
| ATM_id | Operation_id | Return_Code | Time |
| --- | --- | --- | --- |
| 1 | "Entering Pin" | "Success" | 2017-01-26T00:10:00.0000000Z |
| 2 | "Opening Money Slot" | "Success" | 2017-01-26T00:10:07.0000000Z |
| 2 | "Closing Money Slot" | "Success" | 2017-01-26T00:10:11.0000000Z |
| 1 | "Entering Withdraw Quantity" | "Success" | 2017-01-26T00:10:08.0000000Z |
| 1 | "Opening Money Slot" | "Warning" | 2017-01-26T00:10:14.0000000Z |
| 1 | "Printing Bank Balance" | "Warning" | 2017-01-26T00:10:19.0000000Z |
Ausgabe:
| ATM_id | First_Warning_Operation_id | Warning_Time |
| --- | --- | --- |
| 1 | "Opening Money Slot" | 2017-01-26T00:10:14.0000000Z |
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 Success.Return_Code = 'Success',
Warning AS Warning.Return_Code <> 'Success'
) AS patternMatch
Diese Abfrage gleicht mindestens zwei aufeinander folgende Fehlerereignisse ab und generiert einen Alarm, wenn die Bedingungen erfüllt sind. PATTERN definiert den regulären Ausdruck, der für den Abgleich verwendet werden soll, in diesem Fall mindestens zwei aufeinander folgende Warnungen nach mindestens einem erfolgreichen Vorgang. Sobald die Bedingung erfüllt ist, werden Erfolg und Warnung mithilfe des Return_Code-Werts definiert. Die MEASURES** werden mit ATM_id, dem ersten Warnvorgang und der ersten Warnzeit projiziert.
Weitere Informationen finden Sie unter MATCH_RECOGNIZE.
Geofencing- und Geospatialabfragen
Azure Stream Analytics bietet integrierte Geospatialfunktionen, die verwendet werden können, um Szenarien wie Flottenverwaltung, Fahrfreigabe, verbundene Autos und Asset Tracking zu implementieren. Geospatialdaten können entweder in GeoJSON- oder WKT-Formaten als Teil von Eventstream- oder Referenzdaten aufgenommen werden. Zum Beispiel ein Unternehmen, das auf Fertigungsmaschinen zum Drucken von Pässen spezialisiert ist, leaset ihre Maschinen an Regierungen und Konsulate. Der Standort dieser Maschinen wird stark kontrolliert, um die Fehlplatzierung und die mögliche Verwendung für die Fälschung von Pässen zu vermeiden. Jede Maschine ist mit einem GPS-Tracker ausgestattet, dessen Informationen an einen Azure Stream Analytics-Auftrag weitergeleitet werden. Der Hersteller möchte den Standort dieser Maschinen nachverfolgen und benachrichtigt werden, wenn eine von ihnen einen autorisierten Bereich verlässt. Auf diese Weise können sie die Geräte aus der Ferne deaktivieren, die Behörden warnen und die Ausrüstung wiederbeschaffen.
Eingabe:
| Equipment_id | Equipment_current_location | Time |
| --- | --- | --- |
| 1 | "POINT(-122.13288797982818 47.64082002051315)" | 2017-01-26T00:10:00.0000000Z |
| 1 | "POINT(-122.13307252987875 47.64081350934929)" | 2017-01-26T00:11:00.0000000Z |
| 1 | "POINT(-122.13308862313283 47.6406508603241)" | 2017-01-26T00:12:00.0000000Z |
| 1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00.0000000Z |
Referenzdateneingabe:
| Equipment_id | Equipment_lease_location |
| --- | --- |
| 1 | "POLYGON((-122.13326028450979 47.6409833866794,-122.13261655434621 47.6409833866794,-122.13261655434621 47.64061471602751,-122.13326028450979 47.64061471602751,-122.13326028450979 47.6409833866794))" |
Ausgabe:
| Equipment_id | Equipment_alert_location | Time |
| --- | --- | --- |
| 1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00.0000000Z |
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_current_location, referenceInput.Equipment_lease_location) = 1
Die Abfrage ermöglicht es dem Hersteller, den Standort des Computers automatisch zu überwachen und Warnungen zu erhalten, wenn ein Computer den zulässigen Geofence verlässt. Mit der integrierten Geospatialfunktion können Benutzer GPS-Daten innerhalb der Abfrage ohne Drittanbieterbibliotheken verwenden.
Weitere Informationen finden Sie im Artikel Geofencing- und Geospatialaggregationsszenarien mit Azure Stream Analytics.
Hilfe erhalten
Weitere Unterstützung finden Sie auf der Frageseite von Microsoft Q&A (Fragen und Antworten) zu Azure Stream Analytics.