Algemene querypatronen in Azure Stream Analytics

Query's in Azure Stream Analytics worden uitgedrukt in een SQL-achtige querytaal. De taalconstructies worden beschreven in de naslaghandleiding voor de Querytaal van Stream Analytics.

Het queryontwerp kan eenvoudige passthrough-logica uitdrukken om gebeurtenisgegevens van één invoerstroom naar een uitvoergegevensarchief te verplaatsen, of kan uitgebreide patroonkoppeling en tijdelijke analyse uitvoeren om aggregaties te berekenen in verschillende tijdvensters, zoals in de Stream Analytics-handleiding voor het bouwen van een IoT-oplossing. U kunt gegevens uit meerdere invoer samenvoegen om streaminggebeurtenissen te combineren en u kunt zoekacties uitvoeren op basis van statische referentiegegevens om de gebeurteniswaarden te verrijken. U kunt ook gegevens naar meerdere uitvoer schrijven.

In dit artikel vindt u een overzicht van oplossingen voor verschillende algemene querypatronen op basis van praktijkscenario's.

Ondersteunde gegevensindelingen

Azure Stream Analytics biedt ondersteuning voor het verwerken van gebeurtenissen in CSV-, JSON- en Avro-gegevensindelingen. De JSON- en Avro-indelingen kunnen complexe typen bevatten, zoals geneste objecten (records) of matrices. Zie JSON- en AVRO-gegevens parseren voor meer informatie over het werken met deze complexe gegevenstypen.

Gegevens naar meerdere uitvoer verzenden

Er kunnen meerdere SELECT-instructies worden gebruikt om gegevens uit te voeren naar verschillende uitvoersinks. Eén SELECT-instructie kan bijvoorbeeld een waarschuwing op basis van drempelwaarden uitvoeren, terwijl een andere een gebeurtenis naar een blobopslag kan uitvoeren.

Houd rekening met de volgende invoer:

| 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 |

En u wilt de volgende twee uitvoer van de query:

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 |

Voer een query uit met twee SELECT-instructies met archiefuitvoer en waarschuwingsuitvoer als uitvoer:

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

De INTO-component vertelt de Stream Analytics-service naar welke van de uitvoer de gegevens moeten worden geschreven. De eerste SELECT definieert een passthrough-query die gegevens van de invoer ontvangt en verzendt deze naar de uitvoer met de naam ArchiveOutput. Met de tweede query worden gegevens geaggregeerd en gefilterd voordat de resultaten worden verzonden naar een downstreamwaarschuwingssysteemuitvoer met de naam AlertOutput.

De WITH-component kan worden gebruikt om meerdere subqueryblokken te definiëren. Deze optie biedt het voordeel minder lezers te openen voor de invoerbron.

Query:

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

Zie de WITH-component voor meer informatie.

Eenvoudige passthrough-query

Een eenvoudige passthrough-query kan worden gebruikt om de invoerstroomgegevens naar de uitvoer te kopiëren. Als bijvoorbeeld een gegevensstroom met realtime voertuiggegevens moet worden opgeslagen in een SQL-database voor latere analyse, voert een eenvoudige passthrough-query de taak uit.

Houd rekening met de volgende invoer:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

U wilt dat de uitvoer hetzelfde is als de invoer:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

Dit is de query:

SELECT
	*
INTO Output
FROM Input

Met deze SELECT *-query worden alle velden van een binnenkomende gebeurtenis geprojecteert en naar de uitvoer verzonden. In plaats daarvan kunt u alleen de vereiste velden in een SELECT-instructie projecteer. In het volgende voorbeeld projecteert de SELECT-instructie alleen de velden Make en Time uit de invoergegevens.

Houd rekening met de volgende invoer:

| 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 |

U wilt dat de uitvoer alleen de velden Make en Time bevat:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:04.0000000Z |

Dit is de query die alleen de vereiste velden projecteert:

SELECT
	Make, Time
INTO Output
FROM Input

Tekenreeks die overeenkomt met LIKE en NOT LIKE

LIKE en NOT LIKE kunnen worden gebruikt om te controleren of een veld overeenkomt met een bepaald patroon. U kunt bijvoorbeeld een filter gebruiken om alleen de licentieplaten te retourneren die beginnen met de letter A en eindigen op het nummer 9.

Houd rekening met de volgende invoer:

| 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 |

U wilt dat de uitvoer de licentieplaten bevat die beginnen met de letter A en eindigen op het nummer9:

| Make | License_plate | Time |
| --- | --- | --- |
| Make2 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make3 |ABC-369 |2023-01-01T00:00:03.0000000Z |

Hier volgt een query die gebruikmaakt van de LIKE-operator:

SELECT
	*
FROM
	Input TIMESTAMP BY Time
WHERE
	License_plate LIKE 'A%9'

Gebruik de INSTRUCTIE LIKE om de License_plate veldwaarde te controleren. Deze moet beginnen met de letter Aen vervolgens een tekenreeks van nul of meer tekens hebben, eindigend op het getal 9.

Berekening van eerdere gebeurtenissen

De LAG-functie kan worden gebruikt om eerdere gebeurtenissen binnen een tijdvenster te bekijken en deze te vergelijken met de huidige gebeurtenis. Het maken van de huidige auto kan bijvoorbeeld worden uitgevoerd als deze verschilt van het merk van de laatste auto die door de tolcel is gepasseerd.

Voorbeeldinvoer:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |

Voorbeelduitvoer:

| Make | Time |
| --- | --- |
| Make2 |2023-01-01T00:00:02.0000000Z |

Voorbeeldquery:

SELECT
	Make,
	Time
FROM
	Input TIMESTAMP BY Time
WHERE
	LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make

Gebruik LAG om één gebeurtenis terug te bekijken in de invoerstroom, de waarde Make op te halen en deze te vergelijken met de Make-waarde van de huidige gebeurtenis en de gebeurtenis uit te voeren.

Zie LAG voor meer informatie.

De laatste gebeurtenis in een venster retourneren

Omdat gebeurtenissen in realtime door het systeem worden gebruikt, is er geen functie die kan bepalen of een gebeurtenis de laatste is die voor dat tijdvenster moet worden ontvangen. Hiervoor moet de invoerstroom worden gekoppeld aan een andere stroom waarbij het tijdstip van een gebeurtenis de maximale tijd is voor alle gebeurtenissen in dat venster.

Voorbeeldinvoer:

| 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 |

Voorbeelduitvoer met informatie over laatste auto's in twee tijdvensters van tien minuten:

| License_plate | Make | Time |
| --- | --- | --- |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

Voorbeeldquery:

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

Met de eerste stap in de query wordt het maximale tijdstempel gevonden in vensters van tien minuten, dat wil gezegd, het tijdstempel van de laatste gebeurtenis voor dat venster. De tweede stap voegt de resultaten van de eerste query samen met de oorspronkelijke stream om de gebeurtenis te vinden die overeenkomt met de laatste tijdstempels in elk venster.

DATEDIFF is een datumspecifieke functie waarmee het tijdsverschil tussen twee Datum/tijd-velden wordt vergeleken en geretourneerd. Zie datumfuncties voor meer informatie.

Zie JOIN voor meer informatie over het samenvoegen van streams.

Gegevensaggregatie in de loop van de tijd

Als u gegevens in een tijdvenster wilt berekenen, kunt u de gegevens aggregeren. In dit voorbeeld berekent de instructie een telling van de afgelopen 10 seconden voor elke specifieke make van een auto.

Voorbeeldinvoer:

| 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 |

Voorbeelduitvoer:

| Make | Count |
| --- | --- |
| Make1 | 2 |
| Make2 | 1 |

Query:

SELECT
	Make,
	COUNT(*) AS Count
FROM
	Input TIMESTAMP BY Time
GROUP BY
	Make,
	TumblingWindow(second, 10)

Deze aggregatie groepeert de auto's op Make en telt ze elke 10 seconden. De uitvoer heeft de Make en Count van auto's die door de tolcel gingen.

TumblingWindow is een vensterfunctie die wordt gebruikt om gebeurtenissen samen te groeperen. Een aggregatie kan worden toegepast op alle gegroepeerde gebeurtenissen. Zie vensterfuncties voor meer informatie.

Zie statistische functies voor meer informatie over aggregatie.

Periodiek uitvoerwaarden

Wanneer gebeurtenissen ontbreken of onregelmatig zijn, kan een normale intervaluitvoer worden gegenereerd op basis van een meer parserend gegevensinvoer. Genereer bijvoorbeeld elke 5 seconden een gebeurtenis die het laatst gezien gegevenspunt rapporteert.

Voorbeeldinvoer:

| 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 |

Voorbeelduitvoer (eerste 10 rijen):

| 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 |

Voorbeeldquery:

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)

Deze query genereert gebeurtenissen elke 5 seconden en voert de laatste gebeurtenis uit die eerder is ontvangen. De DUUR VAN HOPPINGWINDOW bepaalt hoe ver terug de query eruitziet om de meest recente gebeurtenis te vinden.

Zie Hopping-venster voor meer informatie.

Gebeurtenissen in een stream correleren

Het correleren van gebeurtenissen in dezelfde stroom kan worden uitgevoerd door eerdere gebeurtenissen te bekijken met behulp van de LAG-functie . Een uitvoer kan bijvoorbeeld elke keer worden gegenereerd wanneer twee opeenvolgende auto's van hetzelfde Merk in de afgelopen 90 seconden door de tolcel gaan.

Voorbeeldinvoer:

| 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 |

Voorbeelduitvoer:

| 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 |

Voorbeeldquery:

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

De LAG-functie kan één gebeurtenis terugkijken in de invoerstroom en de Waarde Make ophalen, waarbij deze wordt vergeleken met de waarde Make van de huidige gebeurtenis. Zodra aan de voorwaarde is voldaan, kunnen gegevens van de vorige gebeurtenis worden geprojecteerd met behulp van LAG in de SELECT-instructie.

Zie LAG voor meer informatie.

De duur tussen gebeurtenissen detecteren

De duur van een gebeurtenis kan worden berekend door naar de laatste begingebeurtenis te kijken zodra een eindgebeurtenis is ontvangen. Deze query kan handig zijn om de tijd te bepalen die een gebruiker besteedt aan een pagina of functie.

Voorbeeldinvoer:

| 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 |

Voorbeelduitvoer:

| User | Feature | Duration |
| --- | --- | --- |
| user@location.com |RightMenu |7 |

Voorbeeldquery:

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'

De functie LAST kan worden gebruikt om de laatste gebeurtenis binnen een specifieke voorwaarde op te halen. In dit voorbeeld is de voorwaarde een gebeurtenis van het type Start, waarbij de zoekopdracht wordt gepartitioneerd op PARTITION BY-gebruiker en functie. Op deze manier worden elke gebruiker en functie onafhankelijk behandeld bij het zoeken naar de gebeurtenis Start. LIMIT DURATION beperkt de zoekopdracht terug in de tijd tot 1 uur tussen de gebeurtenissen Einde en Begindatum.

Unieke waarden tellen

COUNT en DISTINCT kunnen worden gebruikt om het aantal unieke veldwaarden te tellen dat binnen een tijdvenster in de stroom wordt weergegeven. U kunt een query maken om te berekenen hoeveel unieke Merken van auto's door de tolcel zijn doorgegeven in een venster van 2 seconden.

Voorbeeldinvoer:

| 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 |

Voorbeelduitvoer :

| Count_make | Time |
| --- | --- |
| 2 |2023-01-01T00:00:02.000Z |
| 1 |2023-01-01T00:00:04.000Z |

Voorbeeldquery :

SELECT
     COUNT(DISTINCT Make) AS Count_make,
     System.TIMESTAMP() AS Time
FROM Input TIMESTAMP BY TIME
GROUP BY 
     TumblingWindow(second, 2)

COUNT(DISTINCT Make) retourneert het aantal afzonderlijke waarden in de kolom Make binnen een tijdvenster. Zie de statistische functie COUNT voor meer informatie.

De eerste gebeurtenis in een venster ophalen

U kunt de IsFirst eerste gebeurtenis in een tijdvenster ophalen. Bijvoorbeeld het uitvoeren van de eerste autogegevens bij elke interval van 10 minuten.

Voorbeeldinvoer:

| 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 |

Voorbeelduitvoer:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |

Voorbeeldquery:

SELECT 
	License_plate,
	Make,
	Time
FROM 
	Input TIMESTAMP BY Time
WHERE 
	IsFirst(minute, 10) = 1

IsFirst kan de gegevens ook partitioneren en de eerste gebeurtenis berekenen voor elke specifieke auto Make die elke interval van 10 minuten wordt gevonden.

Voorbeelduitvoer:

| 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 |

Voorbeeldquery:

SELECT 
	License_plate,
	Make,
	Time
FROM 
	Input TIMESTAMP BY Time
WHERE 
	IsFirst(minute, 10) OVER (PARTITION BY Make) = 1

Zie IsFirst voor meer informatie.

Dubbele gebeurtenissen in een venster verwijderen

Wanneer u een bewerking uitvoert, zoals het berekenen van gemiddelden over gebeurtenissen in een bepaald tijdvenster, moeten dubbele gebeurtenissen worden gefilterd. In het volgende voorbeeld is de tweede gebeurtenis een duplicaat van de eerste.

Voorbeeldinvoer:

| 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 |

Voorbeelduitvoer:

| AverageValue | DeviceId |
| --- | --- |
| 70 | 1 |
|45 | 2 |

Voorbeeldquery:

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)

Wanneer de eerste instructie wordt uitgevoerd, worden de dubbele records gecombineerd tot één record als de velden in de group by-component allemaal hetzelfde zijn. Daarom worden de duplicaten verwijderd.

Logica opgeven voor verschillende cases/waarden (CASE-instructies)

CASE-instructies kunnen verschillende berekeningen bieden voor verschillende velden, op basis van een bepaald criterium. Wijs bijvoorbeeld lane A toe aan auto's van Make1 en rijstrook B aan een ander merk.

Voorbeeldinvoer:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

Voorbeelduitvoer:

| Make |Dispatch_to_lane | Time |
| --- | --- | --- |
| Make1 |"A" |2023-01-01T00:00:01.0000000Z |
| Make2 |"B" |2023-01-01T00:00:02.0000000Z |

Voorbeeldquery:

SELECT
	Make
	CASE
		WHEN Make = "Make1" THEN "A"
		ELSE "B"
	END AS Dispatch_to_lane,
	System.TimeStamp() AS Time
FROM
	Input TIMESTAMP BY Time

De CASE-expressie vergelijkt een expressie met een set eenvoudige expressies om het resultaat ervan te bepalen. In dit voorbeeld worden voertuigen Make1 naar de rijbaan A verzonden terwijl voertuigen van elk ander merk worden toegewezen B.

Zie de case-expressie voor meer informatie.

Gegevensconversie

Gegevens kunnen in realtime worden gecast met behulp van de CAST-methode . Autogewicht kan bijvoorbeeld worden geconverteerd van het type nvarchar(max) om bigint te typen en te worden gebruikt in een numerieke berekening.

Voorbeeldinvoer:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

Voorbeelduitvoer:

| Make | Weight |
| --- | --- |
| Make1 |3000 |

Voorbeeldquery:

SELECT
	Make,
	SUM(CAST(Weight AS BIGINT)) AS Weight
FROM
	Input TIMESTAMP BY Time
GROUP BY
	Make,
	TumblingWindow(second, 10)

Gebruik een CAST-instructie om het gegevenstype op te geven. Bekijk de lijst met ondersteunde gegevenstypen voor gegevenstypen (Azure Stream Analytics).

Voor meer informatie over functies voor gegevensconversie.

De duur van een voorwaarde detecteren

Voor voorwaarden die meerdere gebeurtenissen omvatten, kan de LAG-functie worden gebruikt om de duur van die voorwaarde te identificeren. Stel dat een bug heeft geresulteerd in alle auto's met een onjuist gewicht (meer dan 20.000 pond) en dat de duur van die bug moet worden berekend.

Voorbeeldinvoer:

| 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 |

Voorbeelduitvoer:

| Start_fault | End_fault |
| --- | --- |
| 2023-01-01T00:00:02.000Z |2023-01-01T00:00:07.000Z |

Voorbeeldquery:

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

De eerste SELECT-instructie correleert de huidige gewichtsmeting met de vorige meting, waarbij deze samen met de huidige meting wordt geprojecteerd. De tweede SELECT kijkt terug naar de laatste gebeurtenis waarbij de previous_weight kleiner is dan 20000, waarbij het huidige gewicht kleiner is dan 20000 en de previous_weight van de huidige gebeurtenis groter was dan 20000.

De End_fault is de huidige niet-standaardgebeurtenis waarbij de vorige gebeurtenis defect was en de Start_fault de laatste niet-standaardgebeurtenis is.

Gebeurtenissen verwerken met onafhankelijke tijd (Substreams)

Gebeurtenissen kunnen te laat of niet in orde zijn vanwege klokverschil tussen gebeurtenisproducenten, klokverschil tussen partities of netwerklatentie. De klok van het apparaat voor TollID 2 is bijvoorbeeld vijf seconden achter TollID 1 en de apparaatklok voor TollID 3 is 10 seconden achter TollID 1. Een berekening kan onafhankelijk van elkaar worden uitgevoerd voor elke tol, rekening houdend met alleen zijn eigen klokgegevens als een tijdstempel.

Voorbeeldinvoer:

| 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 |

Voorbeelduitvoer:

| TollID | Count |
| --- | --- |
| 1 | 2 |
| 2 | 2 |
| 1 | 1 |
| 3 | 1 |
| 2 | 1 |
| 3 | 1 |

Voorbeeldquery:

SELECT
      TollId,
      COUNT(*) AS Count
FROM input
      TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId

De COMPONENT TIMESTAMP OVER BY bekijkt elke tijdlijn van het apparaat onafhankelijk van elkaar met behulp van substromen. De uitvoergebeurtenis voor elke TollID wordt gegenereerd terwijl ze worden berekend, wat betekent dat de gebeurtenissen in volgorde staan voor elke TollID in plaats van opnieuw te ordenen alsof alle apparaten op dezelfde klok staan.

Zie TIMESTAMP BY OVER voor meer informatie.

Sessievensters

Een sessievenster is een venster dat steeds wordt uitgebreid naarmate gebeurtenissen plaatsvinden en wordt gesloten voor berekeningen als er na een bepaalde tijd geen gebeurtenis wordt ontvangen of als het venster de maximale duur bereikt. Dit venster is met name handig bij het berekenen van gebruikersinteractiegegevens. Een venster wordt gestart wanneer een gebruiker met het systeem begint te communiceren en wordt gesloten wanneer er geen gebeurtenissen meer worden waargenomen, wat betekent dat de gebruiker niet meer communiceert. Een gebruiker communiceert bijvoorbeeld met een webpagina waarin het aantal klikken wordt geregistreerd, een sessievenster kan worden gebruikt om te achterhalen hoelang de gebruiker interactie heeft gehad met de site.

Voorbeeldinvoer:

| 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" |

Voorbeelduitvoer:

| 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 |

Voorbeeldquery:

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)

Select projecteert de gegevens die relevant zijn voor de interactie van de gebruiker, samen met de duur van de interactie. De gegevens groeperen op gebruiker en een SessionWindow die wordt gesloten als er binnen 1 minuut geen interactie plaatsvindt, met een maximale venstergrootte van 60 minuten.

Zie Sessievenster voor meer informatie over SessionWindow.

Door de gebruiker gedefinieerde functies in JavaScript en C#

Azure Stream Analytics-querytaal kan worden uitgebreid met aangepaste functies die zijn geschreven in JavaScript- of C#-taal. Door de gebruiker gedefinieerde functies (UDF) zijn aangepaste/complexe berekeningen die niet eenvoudig kunnen worden uitgedrukt met behulp van de SQL-taal . Deze UDF's kunnen eenmaal worden gedefinieerd en meerdere keren in een query worden gebruikt. Een UDF kan bijvoorbeeld worden gebruikt om een hexadecimale nvarchar(max) -waarde te converteren naar een bigint-waarde .

Voorbeeldinvoer:

| Device_id | HexValue |
| --- | --- |
| 1 | "B4" |
| 2 | "11B" |
| 3 | "121" |

Voorbeelduitvoer:

| 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

De door de gebruiker gedefinieerde functie berekent de bigint-waarde van de HexValue op elke verbruikte gebeurtenis.

Zie JavaScript en C# voor meer informatie.

Geavanceerde patroonkoppeling met MATCH_RECOGNIZE

MATCH_RECOGNIZE is een geavanceerd mechanisme voor patroonkoppeling dat kan worden gebruikt om een reeks gebeurtenissen te koppelen aan een goed gedefinieerd patroon voor reguliere expressies. Een ATM wordt bijvoorbeeld in realtime gecontroleerd op storingen, tijdens de werking van de ATM als er twee opeenvolgende waarschuwingsberichten zijn, moet de beheerder hiervan op de hoogte worden gesteld.

Input:

| 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 |

Uitvoer:

| 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 Succes.Return_Code = 'Success',
		Warning AS Warning.Return_Code <> 'Success'
) AS patternMatch

Deze query komt overeen met ten minste twee opeenvolgende mislukte gebeurtenissen en genereert een alarm wanneer aan de voorwaarden wordt voldaan. PATTERN definieert de reguliere expressie die moet worden gebruikt voor de overeenkomende, in dit geval ten minste twee opeenvolgende waarschuwingen na ten minste één geslaagde bewerking. Geslaagd en waarschuwing worden gedefinieerd met behulp van Return_Code waarde en zodra aan de voorwaarde is voldaan, worden de METINGEN geprojecteerd met ATM_id, de eerste waarschuwingsbewerking en de eerste waarschuwingstijd.

Zie MATCH_RECOGNIZE voor meer informatie.

Geofencing- en georuimtelijke query's

Azure Stream Analytics biedt ingebouwde georuimtelijke functies die kunnen worden gebruikt voor het implementeren van scenario's zoals vlootbeheer, het delen van ritten, verbonden auto's en het bijhouden van assets. Georuimtelijke gegevens kunnen worden opgenomen in GeoJSON- of WKT-indelingen als onderdeel van de gebeurtenisstroom of referentiegegevens. Een bedrijf dat gespecialiseerd is in productiemachines voor het afdrukken van paspoorten, huurt bijvoorbeeld hun machines in bij overheden en consulaten. De locatie van deze machines wordt zwaar gecontroleerd om te voorkomen dat de misplaatsing en het mogelijke gebruik voor het vervalsen van paspoorten. Elke machine is uitgerust met een GPS-tracker, die informatie wordt teruggegeven aan een Azure Stream Analytics-taak. De fabrikant wil de locatie van deze machines bijhouden en worden gewaarschuwd als een van hen een geautoriseerd gebied verlaat, op deze manier kunnen ze op afstand uitschakelen, waarschuwen en de apparatuur ophalen.

Input:

| 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 |

Referentiegegevensinvoer:

| 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))" |

Uitvoer:

| 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_currenct_location, referenceInput.Equipment_lease_location) = 1

Met de query kan de fabrikant de locatie van de machines automatisch bewaken en waarschuwingen ontvangen wanneer een machine de toegestane geofence verlaat. Met de ingebouwde georuimtelijke functie kunnen gebruikers GPS-gegevens in de query gebruiken zonder bibliotheken van derden.

Zie het artikel Geofencing en georuimtelijke aggregatiescenario's met Azure Stream Analytics voor meer informatie.

Hulp vragen

Probeer onze microsoft Q&A-vragenpagina voor Azure Stream Analytics voor meer hulp.

Volgende stappen