Algemene querypatronen in Azure Stream Analytics
Query's in Azure Stream Analytics worden uitgedrukt in SQL querytaal. De taal constructs worden beschreven in de handleiding Stream Analytics querytaal.
Het queryontwerp kan eenvoudige pass-through-logica uitdrukken om gebeurtenisgegevens van één invoerstroom naar een uitvoergegevensopslag te verplaatsen, of kan uitgebreide patroonmatching en tijdelijke analyse uitvoeren om statistische functies in verschillende tijdvensters te berekenen, zoals in de handleiding Een IoT-oplossing bouwen met behulp van Stream Analytics. U kunt gegevens uit meerdere invoergegevens koppelen om streaminggebeurtenissen te combineren en u kunt opzoekingen doen op basis van statische referentiegegevens om de gebeurteniswaarden te verrijken. U kunt ook gegevens naar meerdere uitvoer schrijven.
In dit artikel worden oplossingen beschreven voor verschillende veelvoorkomende querypatronen op basis van echte scenario's.
Ondersteunde gegevensindelingen
Azure Stream Analytics ondersteunt het verwerken van gebeurtenissen in CSV-, JSON- en Avro-gegevensindelingen.
Zowel JSON als Avro kunnen complexe typen bevatten, zoals geneste objecten (records) of matrices. Raadpleeg het artikel 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 geven naar verschillende uitvoer-sinks. Eén SELECT kan bijvoorbeeld een waarschuwing op basis van drempelwaarden produceren, terwijl een andere een gebeurtenis naar blob-opslag kan uitvoeren.
Invoer:
| Merk | Tijd |
|---|---|
| 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 |
UitvoerarchiefUitvoer:
| Merk | Tijd |
|---|---|
| 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 |
UitvoerwaarschuwingUitvoer:
| Merk | Tijd | Count |
|---|---|---|
| Make2 | 2015-01-01T00:00:10Z | 3 |
Query:
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 Stream Analytics naar welke van de uitvoer de gegevens moeten worden geschreven. De eerste SELECT definieert een pass-through-query die gegevens van de invoer ontvangt en verzendt naar de uitvoer met de naam ArchiveOutput. Met de tweede query wordt een eenvoudige aggregatie en filtering uitgevoerd voordat de resultaten worden verzonden naar een downstreamsysteemuitvoer met de naam AlertOutput.
Houd er rekening mee dat de WITH-component kan worden gebruikt om meerdere subqueryblokken te definiëren. Deze optie heeft als voordeel dat er minder lezers worden geopend 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
Raadpleeg with-component voor meer informatie.
Eenvoudige pass-through-query
Een eenvoudige pass-through-query kan worden gebruikt om de invoerstroomgegevens naar de uitvoer te kopiëren. Als bijvoorbeeld een stroom gegevens met realtime voertuiggegevens moet worden opgeslagen in een SQL-database voor letteranalyse, wordt de taak uitgevoerd met een eenvoudige pass-through-query.
Invoer:
| Merk | Tijd | Gewicht |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | "1000" |
| Make1 | 2015-01-01T00:00:02Z | "2000" |
Uitvoer:
| Merk | Tijd | Gewicht |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | "1000" |
| Make1 | 2015-01-01T00:00:02Z | "2000" |
Query:
SELECT
*
INTO Output
FROM Input
Met een SELECT *-query worden alle velden van een binnenkomende gebeurtenis projecten en worden deze naar de uitvoer verzendt. Op dezelfde manier kan SELECT ook worden gebruikt om alleen vereiste velden uit de invoer te projecten. Als het voertuig Make en Time in dit voorbeeld de enige vereiste velden zijn die moeten worden opgeslagen, kunnen deze velden worden opgegeven in de SELECT-instructie.
Invoer:
| Merk | Tijd | Gewicht |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | 1000 |
| Make1 | 2015-01-01T00:00:02Z | 2000 |
| Make2 | 2015-01-01T00:00:04Z | 1500 |
Uitvoer:
| Merk | Tijd |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make1 | 2015-01-01T00:00:02Z |
| Make2 | 2015-01-01T00:00:04Z |
Query:
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. Er kan bijvoorbeeld een filter worden gemaakt om alleen de licentieborden te retourneren die beginnen met de letter 'A' en eindigen met het cijfer 9.
Invoer:
| Merk | License_plate | Tijd |
|---|---|---|
| Make1 | ABC-123 | 2015-01-01T00:00:01Z |
| Make2 | AAA-999 | 2015-01-01T00:00:02Z |
| Make3 | ABC-369 | 2015-01-01T00:00:03Z |
Uitvoer:
| Merk | License_plate | Tijd |
|---|---|---|
| Make2 | AAA-999 | 2015-01-01T00:00:02Z |
| Make3 | ABC-369 | 2015-01-01T00:00:03Z |
Query:
SELECT
*
FROM
Input TIMESTAMP BY Time
WHERE
License_plate LIKE 'A%9'
Gebruik de like-instructie om de waarde van License_plate veld te controleren. Deze moet beginnen met de letter 'A', en vervolgens een tekenreeks van nul of meer tekens bevatten, eindigend op het getal 9.
Berekening van eerdere gebeurtenissen
De functie LAG kan worden gebruikt om gebeurtenissen uit het verleden binnen een tijdvenster te bekijken en deze te vergelijken met de huidige gebeurtenis. De huidige auto kan bijvoorbeeld worden uitgevoerd als deze verschilt van de laatste auto die de tol heeft uitgevoerd.
Invoer:
| Merk | Tijd |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make2 | 2015-01-01T00:00:02Z |
Uitvoer:
| Merk | Tijd |
|---|---|
| Make2 | 2015-01-01T00:00:02Z |
Query:
SELECT
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make
Gebruik LAG om de invoerstroom één gebeurtenis terug te bekijken, de waarde Maken op te halen en deze te vergelijken met de Waarde Maken van de huidige gebeurtenis en de gebeurtenis uit te geven.
Raadpleeg LAG voor meer informatie.
De laatste gebeurtenis in een venster retourneren
Omdat gebeurtenissen in realtime door het systeem worden verbruikt, is er geen functie die kan bepalen of een gebeurtenis de laatste is die voor dat tijdvenster aankomt. Hiervoor moet de invoerstroom worden samengevoegd met een andere stroom, waarbij de tijd van een gebeurtenis de maximale tijd is voor alle gebeurtenissen in dat venster.
Invoer:
| License_plate | Merk | Tijd |
|---|---|---|
| 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 | Make4 | 2015-07-27T00:13:45Z |
Uitvoer:
| License_plate | Merk | Tijd |
|---|---|---|
| VFE 1616 | Make2 | 2015-07-27T00:09:31Z |
| MDR 6128 | Make4 | 2015-07-27T00:13:45Z |
Query:
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 van de query wordt de maximale tijdstempel in vensters van 10 minuten gevonden. Dit is de tijdstempel van de laatste gebeurtenis voor dat venster. De tweede stap voegt de resultaten van de eerste query samen met de oorspronkelijke stroom om de gebeurtenis te vinden die overeenkomen met de laatste tijdstempels in elk venster.
DATEDIFF is een datumspecifieke functie die het tijdsverschil tussen twee Datum/tijd-velden vergelijkt en retourneert. Raadpleeg datumfuncties voor meer informatie.
Raadpleeg JOIN voor meer informatie over het samenvoegen van streams.
Gegevensaggregatie in de tijd
Als u informatie wilt berekenen in een tijdvenster, kunnen gegevens samen worden geaggregeerd. In dit voorbeeld wordt een telling berekend over de laatste 10 seconden tijd voor elke specifieke auto.
Invoer:
| Merk | Tijd | Gewicht |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | 1000 |
| Make1 | 2015-01-01T00:00:02Z | 2000 |
| Make2 | 2015-01-01T00:00:04Z | 1500 |
Uitvoer:
| Merk | 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 Maken en telt ze om de 10 seconden. De uitvoer heeft het maken en tellen van auto's die de tol hebben uitgevoerd.
TumblingWindow is een vensterfunctie die wordt gebruikt om gebeurtenissen te groeperen. Een aggregatie kan worden toegepast op alle gegroepeerde gebeurtenissen. Zie vensterfuncties voor meer informatie.
Raadpleeg statistische functies voor meer informatie over aggregatie.
Uitvoerwaarden periodiek
In het geval van onregelmatige of ontbrekende gebeurtenissen kan een regelmatig intervaluitvoer worden gegenereerd op basis van een meer verspreide gegevensinvoer. Genereer bijvoorbeeld elke vijf seconden een gebeurtenis die het meest recent geziene gegevenspunt rapporteert.
Invoer:
| Tijd | Waarde |
|---|---|
| "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 |
Uitvoer (eerste 10 rijen):
| Window_end | Last_event. Tijd | Last_event. Waarde |
|---|---|---|
| 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 |
Query:
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)
Met deze query worden elke vijf seconden gebeurtenissen gegenereerd en wordt de laatste gebeurtenis uitgevoerd die eerder is ontvangen. De duur van HOPPINGWINDOW bepaalt hoe ver terug de query naar de meest recente gebeurtenis zoekt.
Raadpleeg Hopping window (Hopping-venster) voor meer informatie.
Gebeurtenissen in een stroom correleren
Correeren van gebeurtenissen in dezelfde stroom kan worden uitgevoerd door te kijken naar gebeurtenissen uit het verleden met behulp van de functie LAG. Er kan bijvoorbeeld steeds uitvoer worden gegenereerd wanneer twee opeenvolgende auto's van dezelfde make de tol van de afgelopen 90 seconden door moeten.
Invoer:
| Merk | License_plate | Tijd |
|---|---|---|
| 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 | ING-345 | 2015-01-01T00:00:04Z |
Uitvoer:
| Merk | Tijd | 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 |
Query:
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 functie LAG kan de invoerstroom één gebeurtenis terug bekijken 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 uit de vorige gebeurtenis worden geprojecteerd met behulp van LAG in de SELECT-instructie.
Raadpleeg LAG voor meer informatie.
De duur tussen gebeurtenissen detecteren
De duur van een gebeurtenis kan worden berekend door te kijken naar de laatste startgebeurtenis zodra een eindegebeurtenis is ontvangen. Deze query kan handig zijn om te bepalen hoeveel tijd een gebruiker op een pagina of functie besteedt.
Invoer:
| Gebruiker | Functie | Gebeurtenis | Tijd |
|---|---|---|---|
| user@location.com | Rechtsmenu | Starten | 2015-01-01T00:00:01Z |
| user@location.com | Rechtsmenu | Beëindigen | 2015-01-01T00:00:08Z |
Uitvoer:
| Gebruiker | Functie | Duur |
|---|---|---|
| user@location.com | Rechtsmenu | 7 |
Query:
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, waarmee de zoekopdracht wordt gepartitioneerd op PARTITION BY-gebruiker en -functie. Op deze manier wordt elke gebruiker en functie onafhankelijk behandeld bij het zoeken naar de gebeurtenis Starten. LIMIETDUUR beperkt de zoekopdracht terug in de tijd tot 1 uur tussen de gebeurtenissen Einde en Start.
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. Er kan een query worden gemaakt om te berekenen hoeveel unieke auto's in 2 seconden via de tolweg worden doorgegeven.
Invoer:
| Merk | Tijd |
|---|---|
| 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 |
Output:
| Count_make | Tijd |
|---|---|
| 2 | 2015-01-01T00:00:02Z |
| 1 | 2015-01-01T00:00:04Z |
Query:
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 Maken binnen een tijdvenster. Raadpleeg count aggregatiefunctie voor meer informatie.
De eerste gebeurtenis in een venster ophalen
IsFirst kan worden gebruikt om de eerste gebeurtenis in een tijdvenster op te halen. Bijvoorbeeld de uitvoer van de eerste autogegevens op elk interval van 10 minuten.
Invoer:
| License_plate | Merk | Tijd |
|---|---|---|
| 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 | Make4 | 2015-07-27T00:13:45Z |
Uitvoer:
| License_plate | Merk | Tijd |
|---|---|---|
| DXE 5291 | Make1 | 2015-07-27T00:00:05Z |
| QYF 9358 | Make1 | 2015-07-27T00:12:02Z |
Query:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) = 1
IsFirst kan ook de gegevens partitioneren en de eerste gebeurtenis berekenen voor elke specifieke auto, Maken gevonden op elk interval van 10 minuten.
Uitvoer:
| License_plate | Merk | Tijd |
|---|---|---|
| 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 | Make4 | 2015-07-27T00:13:45Z |
Query:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) OVER (PARTITION BY Make) = 1
Raadpleeg IsFirstvoor meer informatie.
Dubbele gebeurtenissen in een venster verwijderen
Bij het uitvoeren van een bewerking, 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.
Invoer:
| DeviceId | Tijd | Kenmerk | Waarde |
|---|---|---|---|
| 1 | 2018-07-27T00:00:01Z | Temperatuur | 50 |
| 1 | 2018-07-27T00:00:01Z | Temperatuur | 50 |
| 2 | 2018-07-27T00:00:01Z | Temperatuur | 40 |
| 1 | 2018-07-27T00:00:05Z | Temperatuur | 60 |
| 2 | 2018-07-27T00:00:05Z | Temperatuur | 50 |
| 1 | 2018-07-27T00:00:10Z | Temperatuur | 100 |
Uitvoer:
| AverageValue | DeviceId |
|---|---|
| 70 | 1 |
| 45 | 2 |
Query:
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)
COUNT(DISTINCT Time) retourneert het aantal afzonderlijke waarden in de kolom Tijd binnen een tijdvenster. De uitvoer van de eerste stap kan vervolgens worden gebruikt om het gemiddelde per apparaat te berekenen door duplicaten te verwijderen.
Raadpleeg COUNT(DISTINCT Time)voor meer informatie.
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 banen 'A' toe aan auto's van Make1 en de baan B aan andere voertuigen.
Invoer:
| Merk | Tijd |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make2 | 2015-01-01T00:00:02Z |
| Make2 | 2015-01-01T00:00:03Z |
Uitvoer:
| Merk | Dispatch_to_lane | Tijd |
|---|---|---|
| Make1 | 'A' | 2015-01-01T00:00:01Z |
| Make2 | "B" | 2015-01-01T00:00:02Z |
Oplossing:
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 van Make1 verzonden naar de rij A, terwijl aan voertuigen van een ander voertuig de rij B wordt toegewezen.
Raadpleeg case-expressie voor meer informatie.
Gegevensconversie
Gegevens kunnen in realtime worden gecast met behulp van de CAST-methode. Het gewicht van de auto kan bijvoorbeeld worden geconverteerd van het type nvarchar(max) naar het type bigint en worden gebruikt voor een numerieke berekening.
Invoer:
| Merk | Tijd | Gewicht |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | "1000" |
| Make1 | 2015-01-01T00:00:02Z | "2000" |
Uitvoer:
| Merk | Gewicht |
|---|---|
| Make1 | 3000 |
Query:
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. Zie de lijst met ondersteunde gegevenstypen op Gegevenstypen (Azure Stream Analytics).
Voor meer informatie over functies voor gegevensconversie.
De duur van een voorwaarde detecteren
Voor voorwaarden die meerdere gebeurtenissen bespannen, kan de functie LAG worden gebruikt om de duur van die voorwaarde te identificeren. Stel bijvoorbeeld dat een bug ertoe heeft geleid dat alle auto's een onjuist gewicht hebben (meer dan 20.000 pond), en dat de duur van die fout moet worden berekend.
Invoer:
| Merk | Tijd | Gewicht |
|---|---|---|
| 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 |
Uitvoer:
| Start_fault | End_fault |
|---|---|
| 2015-01-01T00:00:02Z | 2015-01-01T00:00:07Z |
Query:
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, en projecteert deze samen met de huidige meting. 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 is dan 20000.
De End_fault is de huidige niet-defecte gebeurtenis waarbij de vorige gebeurtenis defect was en de Start_fault de laatste niet-defecte gebeurtenis daarvoor is.
Gebeurtenissen verwerken met onafhankelijke tijd (substreams)
Gebeurtenissen kunnen te laat of niet in de volgorde aankomen vanwege scheefheid in de klok tussen gebeurtenisproducenten, klokscheefheid tussen partities of netwerklatentie. De apparaatklok voor TollID 2 is bijvoorbeeld vijf seconden achter op TollID 1 en de apparaatklok voor TollID 3 tien seconden achter op TollID 1. Een berekening kan onafhankelijk van elkaar plaatsvinden voor elke tol, alleen rekening houden met de eigen klokgegevens als een tijdstempel.
Invoer:
| LicensePlate | Merk | Tijd | TollID |
|---|---|---|---|
| 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 | Make4 | 2015-07-27T00:00:07Z | 3 |
Uitvoer:
| TollID | Count |
|---|---|
| 1 | 2 |
| 2 | 2 |
| 1 | 1 |
| 3 | 1 |
| 2 | 1 |
| 3 | 1 |
Query:
SELECT
TollId,
COUNT(*) AS Count
FROM input
TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId
De TIMESTAMP OVER BY-component kijkt onafhankelijk van elkaar naar de tijdlijn van elk apparaat met behulp van substreams. De uitvoergebeurtenis voor elke TollID wordt gegenereerd terwijl ze worden berekend, wat betekent dat de gebeurtenissen in volgorde zijn met betrekking tot elke TollID in plaats van opnieuw te worden rangschikt alsof alle apparaten op dezelfde klok staan.
Raadpleeg TIMESTAMP BY OVERvoor meer informatie.
Sessie Windows
Een sessievenster is een venster dat blijft uitbreiden wanneer gebeurtenissen optreden en wordt gesloten voor berekening als er na een bepaalde tijd geen gebeurtenis wordt ontvangen of als het venster de maximale duur bereikt. Dit venster is met name nuttig bij het berekenen van gegevens over gebruikersinteractie. Er wordt een venster geopend wanneer een gebruiker begint te communiceren met het systeem en wordt gesloten wanneer er geen gebeurtenissen meer worden waargenomen, wat betekent dat de gebruiker is gestopt met communiceren. Een gebruiker communiceert bijvoorbeeld met een webpagina waarop het aantal klikken wordt geregistreerd. Er kan een sessievenster worden gebruikt om erachter te komen hoelang de gebruiker interactie heeft met de site.
Invoer:
| User_id | Tijd | 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" |
Uitvoer:
| 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 |
Query:
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)
De SELECT projectt de gegevens die relevant zijn voor de gebruikersinteractie, samen met de duur van de interactie. Het groeperen van de gegevens per gebruiker en een sessiewindow die wordt gesloten als er binnen 1 minuut geen interactie is, met een maximale venstergrootte van 60 minuten.
Raadpleeg sessievenster voor meer informatie over SessionWindow.
Taalverkenbaarheid met door de gebruiker gedefinieerde functie 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 SQL taal. Deze UDF's kunnen één keer worden gedefinieerd en meerdere keren binnen een query worden gebruikt. Een UDF kan bijvoorbeeld worden gebruikt om een hexadecimale nvarchar(max)-waarde te converteren naar een bigint-waarde.
Invoer:
| Device_id | HexValue |
|---|---|
| 1 | B4 |
| 2 | "11B" |
| 3 | "121" |
Uitvoer:
| Device_id | Decimaal |
|---|---|
| 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 voor elke verbruikte gebeurtenis.
Raadpleeg JavaScript en C# voor meer informatie.
Geavanceerde patroonmatching met MATCH_RECOGNIZE
MATCH_RECOGNIZE is een geavanceerd mechanisme voor patroonmatching 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 die de beheerder op de hoogte moet stellen.
Invoer:
| ATM_id | Operation_id | Return_Code | Tijd |
|---|---|---|---|
| 1 | 'Pincode invoeren' | 'Geslaagd' | 2017-01-26T00:10:00Z |
| 2 | 'Geldsleuf openen' | 'Geslaagd' | 2017-01-26T00:10:07Z |
| 2 | 'Afsluitende geldsleuf' | 'Geslaagd' | 2017-01-26T00:10:11Z |
| 1 | "Ingetrokken hoeveelheid invoeren" | 'Geslaagd' | 2017-01-26T00:10:08Z |
| 1 | 'Geldsleuf openen' | Waarschuwing | 2017-01-26T00:10:14Z |
| 1 | Banksaldo afdrukken | Waarschuwing | 2017-01-26T00:10:19Z |
Uitvoer:
| ATM_id | First_Warning_Operation_id | Warning_Time |
|---|---|---|
| 1 | 'Geldsleuf openen' | 2017-01-26T00:10:14Z |
SELECT *
FROM input TIMESTAMP BY time OVER ATM_id
MATCH_RECOGNIZE (
LIMIT DURATION(minute, 1)
PARTITON 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 foutgebeurtenissen 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 Return_Code waarde en zodra aan de voorwaarde wordt voldaan, worden de METINGEN geprojecteerd met ATM_id, de eerste waarschuwingsbewerking en de eerste waarschuwingstijd.
Raadpleeg voor meer informatie MATCH_RECOGNIZE.
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 fietsen, verbonden auto's en het bijhouden van activa. Georuimtelijke gegevens kunnen worden opgenomen in GeoJSON- of WKT-indelingen als onderdeel van gebeurtenisstroom- of referentiegegevens. Bijvoorbeeld, een bedrijf dat is gespecialiseerd in productiemachines voor het afdrukken van passports, lease hun machines aan overheden en auto's. De locatie van deze machines wordt sterk beheerd om onjuiste en mogelijke gebruiksgegevens voor het vervalsen van paspoorten te voorkomen. Elke computer is voorzien van een GPS-tracker, die informatie wordt door gegeven aan een Azure Stream Analytics taak. De fabrikant wil de locatie van deze machines bijhouden en worden gewaarschuwd als een van deze machines een geautoriseerd gebied verlaat. Op deze manier kunnen ze op afstand uitschakelen, instanties waarschuwen en de apparatuur ophalen.
Invoer:
| Equipment_id | Equipment_current_location | Tijd |
|---|---|---|
| 1 | "POINT(-122.13288797982818 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 |
Referentiegegevensinvoer:
| Equipment_id | Equipment_lease_location |
|---|---|
| 1 | "POLYGON((-122.13326028450979 47.6409833866794,-12261655434621 47.6409833866794,-12226165543462 1 47.64061471602751,-122.13326028450979 47.64061471602751,-122.13326028450979 47.6409833866794)" |
Uitvoer:
| Equipment_id | Equipment_alert_location | Tijd |
|---|---|---|
| 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
Met de query kan de fabrikant de locatie van de machines automatisch controleren 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.
Raadpleeg het artikel Geofencing and geospatial aggregation scenarios with Azure Stream Analytics (Scenario's voor geofencing en georuimtelijke aggregatie met Azure Stream Analytics) voor meer informatie.
Hulp vragen
Voor meer hulp kunt u onze Microsoft Q&A-vragenpagina voor Azure Stream Analytics.