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.

Volgende stappen