Vanliga frågemönster i Azure Stream Analytics
Frågor i Azure Stream Analytics uttrycks i ett SQL liknande frågespråk. Språkkonstruktionerna dokumenteras i guiden Stream Analytics referens för frågespråk.
Frågedesignen kan uttrycka enkel genomströmningslogik för att flytta händelsedata från en indataström till ett utdatalager, eller göra omfattande mönstermatchning och tidsanalys för att beräkna aggregeringar över olika tidsfönster som i guiden Skapa en IoT-lösning med hjälp av Stream Analytics. Du kan koppla data från flera indata för att kombinera direktuppspelningshändelser, och du kan göra uppslag mot statiska referensdata för att utöka händelsevärdena. Du kan också skriva data till flera utdata.
Den här artikeln beskriver lösningar på flera vanliga frågemönster baserat på verkliga scenarier.
Dataformat som stöds
Azure Stream Analytics stöder bearbetning av händelser i CSV-, JSON- och Avro-dataformat.
Både JSON och Avro kan innehålla komplexa typer, till exempel kapslade objekt (poster) eller matriser. Mer information om hur du arbetar med dessa komplexa datatyper finns i artikeln Parsa JSON- och AVRO-data.
Skicka data till flera utdata
Flera SELECT-instruktioner kan användas för att mata ut data till olika utdata-mottagare. En SELECT kan till exempel mata ut en tröskelbaserad avisering medan en annan kan mata ut händelser till Blob Storage.
Indata:
| Modell | Tid |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make1 | 2015-01-01T00:00:02.00000000Z |
| Make2 | 2015-01-01T00:00:01Z |
| Make2 | 2015-01-01T00:00:02.00000000Z |
| Make2 | 2015-01-01T00:00:03Z |
ArkivutdataUtdataUtdata:
| Modell | Tid |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make1 | 2015-01-01T00:00:02.00000000Z |
| Make2 | 2015-01-01T00:00:01Z |
| Make2 | 2015-01-01T00:00:02.00000000Z |
| Make2 | 2015-01-01T00:00:03Z |
UtdataaviseringUtdata:
| Modell | Tid | Antal |
|---|---|---|
| Make2 | 2015-01-01T00:00:10Z | 3 |
Fråga:
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
INTO-satsen Stream Analytics vilka utdata som data ska skrivas till. Den första SELECT definierar en genomströmningsfråga som tar emot data från indata och skickar dem till utdata med namnet ArchiveOutput. Den andra frågan gör viss enkel aggregering och filtrering innan resultatet skickas till ett nedströms aviseringssystem med namnet AlertOutput.
Observera att WITH-satsen kan användas för att definiera flera underfrågeblock. Det här alternativet har fördelen att du öppnar färre läsare för indatakällan.
Fråga:
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
Mer information finns i WITH-satsen.
Enkel direktfråga
En enkel genomströmningsfråga kan användas för att kopiera indataströmmen till utdata. Om till exempel en dataström som innehåller fordonsinformation i realtid måste sparas i en SQL-databas för bokstavsanalys, kommer en enkel genomströmningsfråga att göra jobbet.
Indata:
| Modell | Tid | Vikt |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | "1000" |
| Make1 | 2015-01-01T00:00:02.00000000Z | "2000" |
Utdata:
| Modell | Tid | Vikt |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | "1000" |
| Make1 | 2015-01-01T00:00:02.00000000Z | "2000" |
Fråga:
SELECT
*
INTO Output
FROM Input
En SELECT *-fråga projekterar alla fält i en inkommande händelse och skickar dem till utdata. På samma sätt kan SELECT också användas för att endast projicera obligatoriska fält från indata. I det här exemplet, om fordons make och time är de enda obligatoriska fälten som ska sparas, kan dessa fält anges i SELECT-instruktionen.
Indata:
| Modell | Tid | Vikt |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | 1000 |
| Make1 | 2015-01-01T00:00:02.00000000Z | 2000 |
| Make2 | 2015-01-01T00:00:04.00000000Z | 1500 |
Utdata:
| Modell | Tid |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make1 | 2015-01-01T00:00:02Z |
| Make2 | 2015-01-01T00:00:04Z |
Fråga:
SELECT
Make, Time
INTO Output
FROM Input
Strängmatchning med LIKE och NOT LIKE
LIKE och NOT LIKE kan användas för att kontrollera om ett fält matchar ett visst mönster. Ett filter kan till exempel skapas för att endast returnera de registreringsskyltar som börjar med bokstaven "A" och slutar med siffran 9.
Indata:
| Modell | License_plate | Tid |
|---|---|---|
| Make1 | ABC-123 | 2015-01-01T00:00:01Z |
| Make2 | AAA-999 | 2015-01-01T00:00:02Z |
| Make3 | ABC-369 | 2015-01-01T00:00:03Z |
Utdata:
| Modell | License_plate | Tid |
|---|---|---|
| Make2 | AAA-999 | 2015-01-01T00:00:02Z |
| Make3 | ABC-369 | 2015-01-01T00:00:03Z |
Fråga:
SELECT
*
FROM
Input TIMESTAMP BY Time
WHERE
License_plate LIKE 'A%9'
Använd LIKE-instruktionen för att kontrollera License_plate-fältvärdet. Den bör börja med bokstaven "A" och sedan ha en sträng med noll eller fler tecken som slutar med siffran 9.
Beräkning över tidigare händelser
Funktionen LAG kan användas för att titta på tidigare händelser inom ett tidsfönster och jämföra dem med den aktuella händelsen. Till exempel kan den aktuella bilbilen matas ut om den skiljer sig från den sista bilen som kördes via vägtullen.
Indata:
| Modell | Tid |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make2 | 2015-01-01T00:00:02Z |
Utdata:
| Modell | Tid |
|---|---|
| Make2 | 2015-01-01T00:00:02Z |
Fråga:
SELECT
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make
Använd LAG för att titta på indataströmmen en händelse tillbaka, hämta Värdet Skapa och jämföra det med värdet Make för den aktuella händelsen och mata ut händelsen.
Mer information finns i LAG.
Returnera den sista händelsen i ett fönster
Eftersom händelser förbrukas av systemet i realtid finns det ingen funktion som kan avgöra om en händelse blir den sista som tas emot under den tidsperioden. För att uppnå detta måste indataströmmen vara ansluten till en annan där tiden för en händelse är den maximala tiden för alla händelser i det fönstret.
Indata:
| License_plate | Modell | Tid |
|---|---|---|
| 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 |
Utdata:
| License_plate | Modell | Tid |
|---|---|---|
| VFE 1616 | Make2 | 2015-07-27T00:09:31Z |
| MDR 6128 | Make4 | 2015-07-27T00:13:45Z |
Fråga:
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
Det första steget i frågan hittar den maximala tidsstämpeln i 10-minutersfönster, det vill säga tidsstämpeln för den sista händelsen för det fönstret. Det andra steget sammanfogar resultatet av den första frågan med den ursprungliga dataströmmen för att hitta den händelse som matchar de senaste tidsstämplarna i varje fönster.
DATEDIFF är en datumspecifik funktion som jämför och returnerar tidsskillnaden mellan två DateTime-fält. Mer information finns i datumfunktionerna.
Mer information om hur du ansluter dataströmmar finns i JOIN.
Dataaggregering över tid
För att beräkna information över ett tidsfönster kan data aggregeras tillsammans. I det här exemplet beräknas ett antal under de senaste 10 sekunderna för varje specifik bil.
Indata:
| Modell | Tid | Vikt |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | 1000 |
| Make1 | 2015-01-01T00:00:02.00000000Z | 2000 |
| Make2 | 2015-01-01T00:00:04.00000000Z | 1500 |
Utdata:
| Modell | Antal |
|---|---|
| Make1 | 2 |
| Make2 | 1 |
Fråga:
SELECT
Make,
COUNT(*) AS Count
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Den här aggregeringen grupperar bilar efter Make och räknar dem var 10:e sekund. Utdata har bil make och count som gick via vägtullen.
TumblingWindow är en fönsterfunktion som används för att gruppera händelser. En aggregering kan tillämpas på alla grupperade händelser. Mer information finns i fönsterfunktioner.
Mer information om aggregering finns i mängdfunktioner.
Utdatavärden med jämna mellanrum
Vid oregelbundna eller saknade händelser kan utdata med regelbundna intervall genereras från en mer gles datainmatning. Du kan till exempel generera en händelse var femte sekund som rapporterar den senast sedda datapunkten.
Indata:
| Tid | Värde |
|---|---|
| "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 |
Utdata (de första 10 raderna):
| Window_end | Last_event. Tid | Last_event. Värde |
|---|---|---|
| 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 |
Fråga:
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)
Den här frågan genererar händelser var femte sekund och matar ut den senaste händelsen som togs emot tidigare. HOPPINGWINDOW-varaktigheten avgör hur långt tillbaka frågan ser ut för att hitta den senaste händelsen.
Mer information finns i Hoppande fönster.
Korrelera händelser i en dataström
Korrelering av händelser i samma dataström kan göras genom att titta på tidigare händelser med hjälp av FUNKTIONEN LAG. Till exempel kan utdata genereras varje gång två bilar i följd från samma Make går igenom avgiften för de senaste 90 sekunderna.
Indata:
| Modell | License_plate | Tid |
|---|---|---|
| Make1 | ABC-123 | 2015-01-01T00:00:01Z |
| Make1 | AAA-999 | 2015-01-01T00:00:02.00000000Z |
| Make2 | DEF-987 | 2015-01-01T00:00:03Z |
| Make1 | EFF-345 | 2015-01-01T00:00:04.00000000Z |
Utdata:
| Modell | Tid | Current_car_license_plate | First_car_license_plate | First_car_time |
|---|---|---|---|---|
| Make1 | 2015-01-01T00:00:02.00000000Z | AAA-999 | ABC-123 | 2015-01-01T00:00:01Z |
Fråga:
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
Funktionen LAG kan titta på indataströmmen en händelse tillbaka och hämta värdet Make (Skapa) och jämföra det med make-värdet för den aktuella händelsen. När villkoret är uppfyllt kan data från den föregående händelsen projiceras med hjälp av LAG i SELECT-instruktionen.
Mer information finns i LAG.
Identifiera varaktigheten mellan händelser
Varaktigheten för en händelse kan beräknas genom att titta på den senaste starthändelsen när en sluthändelse tas emot. Den här frågan kan vara användbar för att avgöra hur lång tid en användare tillbringar på en sida eller en funktion.
Indata:
| Användare | Funktion | Händelse | Tid |
|---|---|---|---|
| user@location.com | RightMenu | Start | 2015-01-01T00:00:01Z |
| user@location.com | RightMenu | Slut | 2015-01-01T00:00:08.00000000Z |
Utdata:
| Användare | Funktion | Varaktighet |
|---|---|---|
| user@location.com | RightMenu | 7 |
Fråga:
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'
Funktionen LAST kan användas för att hämta den sista händelsen inom ett visst villkor. I det här exemplet är villkoret en händelse av typen Start, där sökningen partitioneras efter PARTITIONERAD AV användare och funktion. På så sätt behandlas alla användare och funktioner oberoende av varandra när du söker efter Start-händelsen. BEGRÄNSA VARAKTIGHET begränsar sökningen tillbaka i tiden till 1 timme mellan slut- och starthändelserna.
Räkna unika värden
COUNT och DISTINCT kan användas för att räkna antalet unika fältvärden som visas i dataströmmen inom ett tidsfönster. Du kan skapa en fråga för att beräkna hur många unika makes of cars som skickas via avgiftsbelagda bås i ett fönster på 2 sekunder.
Indata:
| Modell | Tid |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make1 | 2015-01-01T00:00:02.00000000Z |
| Make2 | 2015-01-01T00:00:01Z |
| Make2 | 2015-01-01T00:00:02.00000000Z |
| Make2 | 2015-01-01T00:00:03Z |
Produktionen:
| Count_make | Tid |
|---|---|
| 2 | 2015-01-01T00:00:02Z |
| 1 | 2015-01-01T00:00:04Z |
Fråga:
SELECT
COUNT(DISTINCT Make) AS Count_make,
System.TIMESTAMP() AS Time
FROM Input TIMESTAMP BY TIME
GROUP BY
TumblingWindow(second, 2)
COUNT(DISTINCT Make) returnerar antalet distinkta värden i kolumnen Skapa inom ett tidsfönster. Mer information finns i mängdfunktionen COUNT.
Hämta den första händelsen i ett fönster
IsFirst kan användas för att hämta den första händelsen i ett tidsfönster. Du kan till exempel mata ut den första bilinformationen vid varje 10-minutersintervall.
Indata:
| License_plate | Modell | Tid |
|---|---|---|
| DXE 5291 | Make1 | 2015-07-27T00:00:05.00000000Z |
| YZK 5704 | Make3 | 2015-07-27T00:02:17Z |
| RMV 8282 | Make1 | 2015-07-27T00:05:01.00000000Z |
| YHN 6970 | Make2 | 2015-07-27T00:06:00.00000000Z |
| VFE 1616 | Make2 | 2015-07-27T00:09:31.00000000Z |
| QYF 9358 | Make1 | 2015-07-27T00:12:02Z |
| MDR 6128 | Make4 | 2015-07-27T00:13:45.00000000Z |
Utdata:
| License_plate | Modell | Tid |
|---|---|---|
| DXE 5291 | Make1 | 2015-07-27T00:00:05.00000000Z |
| QYF 9358 | Make1 | 2015-07-27T00:12:02Z |
Fråga:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) = 1
IsFirst kan också partitionera data och beräkna den första händelsen för varje specifik bil Make som finns var 10:e minut.
Utdata:
| License_plate | Modell | Tid |
|---|---|---|
| DXE 5291 | Make1 | 2015-07-27T00:00:05.00000000Z |
| YZK 5704 | Make3 | 2015-07-27T00:02:17Z |
| YHN 6970 | Make2 | 2015-07-27T00:06:00.00000000Z |
| QYF 9358 | Make1 | 2015-07-27T00:12:02Z |
| MDR 6128 | Make4 | 2015-07-27T00:13:45.00000000Z |
Fråga:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) OVER (PARTITION BY Make) = 1
Mer information finns i IsFirst.
Ta bort dubbletthändelser i ett fönster
När du utför en åtgärd, till exempel att beräkna medelvärden över händelser i ett visst tidsfönster, ska duplicerade händelser filtreras. I följande exempel är den andra händelsen en dubblett av den första.
Indata:
| DeviceId | Tid | Attribut | Värde |
|---|---|---|---|
| 1 | 2018-07-27T00:00:01Z | Temperatur | 50 |
| 1 | 2018-07-27T00:00:01Z | Temperatur | 50 |
| 2 | 2018-07-27T00:00:01Z | Temperatur | 40 |
| 1 | 2018-07-27T00:00:05.00000000Z | Temperatur | 60 |
| 2 | 2018-07-27T00:00:05.00000000Z | Temperatur | 50 |
| 1 | 2018-07-27T00:00:10Z | Temperatur | 100 |
Utdata:
| AverageValue | DeviceId |
|---|---|
| 70 | 1 |
| 45 | 2 |
Fråga:
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) returnerar antalet distinkta värden i kolumnen Tid inom ett tidsfönster. Utdata från det första steget kan sedan användas för att beräkna medelvärdet per enhet genom att ta bort dubbletter.
Mer information finns i COUNT(DISTINCT Time).
Ange logik för olika ärenden/värden (CASE-instruktioner)
CASE-instruktioner kan ge olika beräkningar för olika fält, baserat på specifika kriterier. Du kan till exempel tilldela band "A" till bilar med Make1 och band "B" till andra bilar.
Indata:
| Modell | Tid |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make2 | 2015-01-01T00:00:02.00000000Z |
| Make2 | 2015-01-01T00:00:03Z |
Utdata:
| Modell | Dispatch_to_lane | Tid |
|---|---|---|
| Make1 | "A" | 2015-01-01T00:00:01Z |
| Make2 | "B" | 2015-01-01T00:00:02.00000000Z |
Lösning:
SELECT
Make
CASE
WHEN Make = "Make1" THEN "A"
ELSE "B"
END AS Dispatch_to_lane,
System.TimeStamp() AS Time
FROM
Input TIMESTAMP BY Time
CASE-uttrycket jämför ett uttryck med en uppsättning enkla uttryck för att fastställa dess resultat. I det här exemplet skickas fordon i Make1 till band "A" medan fordon av någon annan make tilldelas band "B".
Mer information finns i ärendeuttrycket.
Datakonvertering
Data kan castas i realtid med hjälp av CAST-metoden. Bilvikt kan till exempel konverteras från typen nvarchar(max) till bigint och användas i en numerisk beräkning.
Indata:
| Modell | Tid | Vikt |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | "1000" |
| Make1 | 2015-01-01T00:00:02Z | "2000" |
Utdata:
| Modell | Vikt |
|---|---|
| Make1 | 3000 |
Fråga:
SELECT
Make,
SUM(CAST(Weight AS BIGINT)) AS Weight
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Använd en CAST-instruktion för att ange dess datatyp. Se listan över datatyper som stöds för Datatyper (Azure Stream Analytics).
Mer information om datakonverteringsfunktionerfinns i .
Identifiera varaktigheten för ett villkor
För villkor som sträcker sig över flera händelser kan LAG-funktionen användas för att identifiera varaktigheten för villkoret. Anta till exempel att en bugg resulterade i att alla bilar hade en felaktig vikt (över 20 000 pund) och att buggens varaktighet måste beräknas.
Indata:
| Modell | Tid | Vikt |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | 2000 |
| Make2 | 2015-01-01T00:00:02Z | 25000 |
| Make1 | 2015-01-01T00:00:03Z | 26000 |
| Make2 | 2015-01-01T00:00:04Z | 25000 |
| Make1 | 2015-01-01T00:00:05Z | 26000 |
| Make2 | 2015-01-01T00:00:06Z | 25000 |
| Make1 | 2015-01-01T00:00:07Z | 26000 |
| Make2 | 2015-01-01T00:00:08Z | 2000 |
Utdata:
| Start_fault | End_fault |
|---|---|
| 2015-01-01T00:00:02Z | 2015-01-01T00:00:07Z |
Fråga:
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
Den första SELECT-instruktionen korrelerar den aktuella viktmätningen med föregående mätning och projicerar den tillsammans med den aktuella mätningen. Den andra SELECT söker tillbaka till den senaste händelsen där previous_weight är mindre än 20000, där den aktuella vikten är mindre än 20000 och previous_weight för den aktuella händelsen var större än 20000.
Den End_fault är den aktuella icke-felaktiga händelsen där den tidigare händelsen var felaktig och Start_fault är den sista icke-felaktiga händelsen före den.
Bearbeta händelser med oberoende tid (underströmmar)
Händelser kan komma sent eller i fel ordning på grund av klockskevhet mellan händelseproducenter, klockskevhet mellan partitioner eller nätverksfördröjning. Enhetsklockan för TollID 2 är till exempel fem sekunder efter TollID 1 och enhetsklockan för TollID 3 är tio sekunder efter TollID 1. En beräkning kan ske oberoende av varje vägtull, med bara sina egna klockdata som en tidsstämpel.
Indata:
| LicensePlate | Modell | Tid | 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 |
Utdata:
| TollID | Antal |
|---|---|
| 1 | 2 |
| 2 | 2 |
| 1 | 1 |
| 3 | 1 |
| 2 | 1 |
| 3 | 1 |
Fråga:
SELECT
TollId,
COUNT(*) AS Count
FROM input
TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId
TIMESTAMP OVER BY-satsen tittar på varje enhets tidslinje oberoende av underströmmar. Utdatahändelsen för varje TollID genereras när de beräknas, vilket innebär att händelserna är i ordning med avseende på varje TollID i stället för att ordnas om som om alla enheter hade samma klocka.
Mer information finns i TIMESTAMP BY OVER.
Sessions-Windows
Ett sessionsfönster är ett fönster som expanderar allt eftersom händelser inträffar och stängs för beräkning om ingen händelse tas emot efter en viss tid eller om fönstret når sin maximala varaktighet. Det här fönstret är särskilt användbart när du beräknar användarinteraktionsdata. Ett fönster startar när en användare börjar interagera med systemet och stängs när inga fler händelser observeras, vilket innebär att användaren har slutat interagera. En användare interagerar till exempel med en webbsida där antalet klick loggas. Ett sessionsfönster kan användas för att ta reda på hur länge användaren har interagerat med webbplatsen.
Indata:
| User_id | Tid | 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:55.00000000Z | "www.example.com/c.html" |
| 0 | 2017-01-26T00:01:10Z | "www.example.com/d.html" |
| 1 | 2017-01-26T00:01:15.00000000Z | "www.example.com/e.html" |
Utdata:
| User_id | StartTime | EndTime | Duration_in_seconds |
|---|---|---|---|
| 0 | 2017-01-26T00:00:00Z | 2017-01-26T00:01:10Z | 70 |
| 1 | 2017-01-26T00:00:55.00000000Z | 2017-01-26T00:01:15.00000000Z | 20 |
Fråga:
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 projekterar de data som är relevanta för användarinteraktion, tillsammans med interaktionens varaktighet. Gruppering av data efter användare och en SessionWindow som stängs om ingen interaktion sker inom 1 minut, med en maximal fönsterstorlek på 60 minuter.
Mer information om SessionWindow finns i Sessionsfönster.
Språk utökningsbarhet med användardefinierad funktion i JavaScript och C
Azure Stream Analytics kan utökas med anpassade funktioner som skrivits antingen i JavaScript- eller C#-språk. Användardefinierade funktioner (UDF) är anpassade/komplexa beräkningar som inte enkelt kan uttryckas med hjälp av SQL språk. Dessa användardefinierade filer kan definieras en gång och användas flera gånger inom en fråga. En UDF kan till exempel användas för att konvertera ett hexadecimalt nvarchar(max)-värde till ett bigint-värde.
Indata:
| Device_id | HexValue |
|---|---|
| 1 | "B4" |
| 2 | "11B" |
| 3 | "121" |
Utdata:
| 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
Den användardefinierade funktionen beräknar bigint-värdet från HexValue för varje händelse som förbrukas.
Mer information finns i JavaScript och C#.
Avancerad mönstermatchning med MATCH_RECOGNIZE
MATCH_RECOGNIZE är en avancerad metod för mönstermatchning som kan användas för att matcha en sekvens med händelser med ett väldefinierat mönster för reguljära uttryck. Till exempel övervakas en atm i realtid för fel. Under drift av ATM om det finns två på varandra följande varningsmeddelanden måste administratören meddelas.
Indata:
| ATM_id | Operation_id | Return_Code | Tid |
|---|---|---|---|
| 1 | "Ange PIN-kod" | "Lyckades" | 2017-01-26T00:10:00Z |
| 2 | "Öppna Money Slot" | "Lyckades" | 2017-01-26T00:10:07Z |
| 2 | "Closing Money Slot" | "Lyckades" | 2017-01-26T00:10:11Z |
| 1 | "Ange kvantiteten för inmatning" | "Lyckades" | 2017-01-26T00:10:08Z |
| 1 | "Öppna Money Slot" | "Varning" | 2017-01-26T00:10:14Z |
| 1 | "Utskrift av bankbalans" | "Varning" | 2017-01-26T00:10:19Z |
Utdata:
| ATM_id | First_Warning_Operation_id | Warning_Time |
|---|---|---|
| 1 | "Öppna Money Slot" | 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
Den här frågan matchar minst två efterföljande felhändelser och genererar ett larm när villkoren uppfylls. PATTERN definierar det reguljära uttryck som ska användas för matchningen, i det här fallet minst två efterföljande varningar efter minst en lyckad åtgärd. Success och Warning definieras Return_Code värdet och när villkoret har uppfyllts projiceras MÅTTen med ATM_id, den första varningsåtgärden och första varningstiden.
Mer information finns i MATCH_RECOGNIZE.
Geofencing och geospatiala frågor
Azure Stream Analytics innehåller inbyggda geospatiala funktioner som kan användas för att implementera scenarier som vagnparkshantering, delning av resor, anslutna bilar och tillgångsspårning. Geospatiala data kan matas in i antingen GeoJSON- eller WKT-format som en del av händelseströmmen eller referensdata. Ett företag som till exempel är specialiserade på tillverkningsdatorer för att skriva ut pass, leasar sina datorer till myndigheter och myndigheter. Platsen för dessa datorer är kraftigt kontrollerad för att undvika felplattform och möjlig användning för förfalskade pass. Varje dator är försedd med en GPS-spårare. Informationen vidarebefordras tillbaka till ett Azure Stream Analytics jobb. En tillverkare vill hålla reda på var datorerna finns och få aviseringar om någon av dem lämnar ett godkänt område. På så sätt kan de fjärraktivera, varna myndigheter och hämta utrustningen.
Indata:
| Equipment_id | Equipment_current_location | Tid |
|---|---|---|
| 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 |
Indatareferens:
| 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)" |
Utdata:
| Equipment_id | Equipment_alert_location | Tid |
|---|---|---|
| 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
Frågan gör att tillverkaren kan övervaka datorernas plats automatiskt och få aviseringar när en dator lämnar den tillåtna geofence-platsen. Med den inbyggda geospatiala funktionen kan användarna använda GPS-data i frågan utan bibliotek från tredje part.
Mer information finns i artikeln Geofencing och geospatiala aggregeringsscenarier Azure Stream Analytics artikeln.
Få hjälp
Om du vill ha mer hjälp kan du prova vår Microsoft Q&A-frågesida för att Azure Stream Analytics.