Běžné vzory dotazů v Azure Stream Analytics
dotazy v Azure Stream Analytics jsou vyjádřeny v dotazovacím jazyku podobném SQL. Jazykové konstrukce jsou zdokumentovány v referenční příručce jazyka Stream Analytics dotazů .
Návrh dotazu může vyjádřit jednoduchou předávací logiku pro přesun dat událostí z jednoho vstupního datového proudu do výstupního úložiště dat, nebo může provádět bohatou porovnávání vzorů a dočasnou analýzu pro výpočet agregovaných hodnot v různých časových oknech, jako v sestavení řešení IoT pomocí průvodce Stream Analytics . K kombinování událostí streamování můžete spojit data z několika vstupů a můžete provádět vyhledávání na základě statických referenčních dat a rozšířit hodnoty událostí. Můžete také zapisovat data do více výstupů.
Tento článek popisuje řešení několika běžných vzorů dotazů založených na scénářích reálného světa.
Podporované formáty dat
Azure Stream Analytics podporuje zpracování událostí v datových formátech CSV, JSON a Avro.
JSON a Avro mohou obsahovat komplexní typy, jako jsou například vnořené objekty (záznamy) nebo pole. Další informace o práci s těmito komplexními datovými typy najdete v článku Analýza JSON a data Avro .
Odesílání dat do více výstupů
Pro výstup dat do různých výstupních umyvadel lze použít vícenásobné příkazy Select . Například jedna možnost vybrat může vygenerovat výstrahu na základě prahové hodnoty, zatímco jiná může vygenerovat události do úložiště objektů BLOB.
Vstup:
| Značka | Čas |
|---|---|
| Make1 | 2015-01-01T00:00:01.0000000 Z |
| Make1 | 2015-01-01T00:00:02.0000000 Z |
| Make2 | 2015-01-01T00:00:01.0000000 Z |
| Make2 | 2015-01-01T00:00:02.0000000 Z |
| Make2 | 2015-01-01T00:00:03.0000000 Z |
Výstupní ArchiveOutput:
| Značka | Čas |
|---|---|
| Make1 | 2015-01-01T00:00:01.0000000 Z |
| Make1 | 2015-01-01T00:00:02.0000000 Z |
| Make2 | 2015-01-01T00:00:01.0000000 Z |
| Make2 | 2015-01-01T00:00:02.0000000 Z |
| Make2 | 2015-01-01T00:00:03.0000000 Z |
Výstupní AlertOutput:
| Značka | Čas | Počet |
|---|---|---|
| Make2 | 2015-01-01T00:00:10.0000000 Z | 3 |
Dotaz:
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
Klauzule into oznamuje Stream Analytics, na které výstupy mají zapisovat data. První Výběr definuje předávací dotaz, který přijímá data ze vstupu a odesílá je do výstupu s názvem ArchiveOutput. Druhý dotaz provede několik jednoduchých agregací a filtrování před odesláním výsledků do výstupního systému výstrah pro příjem dat s názvem AlertOutput.
Všimněte si, že klauzuli with lze použít k definování více bloků dílčího dotazu. Tato možnost je výhodou otevření menšího počtu čtenářů ke vstupnímu zdroji.
Dotaz:
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
Další informace najdete v tématu s klauzulí with.
Jednoduchý předávací dotaz
Pomocí jednoduchého předávacího dotazu můžete zkopírovat data vstupního datového proudu do výstupu. například pokud se datový proud dat, který obsahuje informace o vozidlech v reálném čase, musí uložit do SQL databáze pro účely analýzy, bude úloha provádět jednoduchý předávací dotaz.
Vstup:
| Značka | Čas | Hmotnost |
|---|---|---|
| Make1 | 2015-01-01T00:00:01.0000000 Z | "1000" |
| Make1 | 2015-01-01T00:00:02.0000000 Z | "2000" |
Výstup:
| Značka | Čas | Hmotnost |
|---|---|---|
| Make1 | 2015-01-01T00:00:01.0000000 Z | "1000" |
| Make1 | 2015-01-01T00:00:02.0000000 Z | "2000" |
Dotaz:
SELECT
*
INTO Output
FROM Input
Dotaz Select * vyprojektech všechna pole příchozí události a odesílá je do výstupu. Stejný způsob, jak Vybrat , lze také použít pouze k projektu povinných polí ze vstupu. V tomto příkladu, pokud je vytvářená a Časová a časová pole, která se mají uložit, je možné tato pole zadat v příkazu Select .
Vstup:
| Značka | Čas | Hmotnost |
|---|---|---|
| Make1 | 2015-01-01T00:00:01.0000000 Z | 1000 |
| Make1 | 2015-01-01T00:00:02.0000000 Z | 2000 |
| Make2 | 2015-01-01T00:00:04.0000000 Z | 1 500 |
Výstup:
| Značka | Čas |
|---|---|
| Značka1 | 2015-01-01T00:00:01Z |
| Značka1 | 2015-01-01T00:00:02Z |
| Značka2 | 2015-01-01T00:00:04Z |
Dotaz:
SELECT
Make, Time
INTO Output
FROM Input
Porovnávání řetězců s like a NOT LIKE
Like a NOT LIKE lze použít k ověření, jestli pole odpovídá určitému vzoru. Můžete například vytvořit filtr, který vrátí pouze registrační desky, které začínají písmenem A a končí číslem 9.
Vstup:
| Značka | License_plate | Čas |
|---|---|---|
| Značka1 | ABC-123 | 2015-01-01T00:00:01Z |
| Značka2 | AAA-999 | 2015-01-01T00:00:02Z |
| Značka3 | ABC-369 | 2015-01-01T00:00:03Z |
Výstup:
| Značka | License_plate | Čas |
|---|---|---|
| Značka2 | AAA-999 | 2015-01-01T00:00:02Z |
| Značka3 | ABC-369 | 2015-01-01T00:00:03Z |
Dotaz:
SELECT
*
FROM
Input TIMESTAMP BY Time
WHERE
License_plate LIKE 'A%9'
Pomocí příkazu LIKE zkontrolujte hodnotu License_plate pole. Měl by začít písmenem "A", pak by měl mít libovolný řetězec nula nebo více znaků, který končí číslem 9.
Výpočet minulých událostí
Funkci LAG můžete použít k zobrazení minulých událostí v časovém okně a jejich porovnání s aktuální událostí. Například aktuální značka auta může být ve výstupu, pokud se liší od posledního auta, které prošly mýtem.
Vstup:
| Značka | Čas |
|---|---|
| Značka1 | 2015-01-01T00:00:01Z |
| Značka2 | 2015-01-01T00:00:02Z |
Výstup:
| Značka | Čas |
|---|---|
| Značka2 | 2015-01-01T00:00:02Z |
Dotaz:
SELECT
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make
Pomocí funkce LAG si prohlédněte vstupní stream o jednu událost zpět, načítáte hodnotu Make a porovnáváte ji s hodnotou Make aktuální události a výstupem události.
Další informace najdete v tématu LAG.
Vrácení poslední události v okně
Vzhledem k tomu, že systém využívá události v reálném čase, neexistuje žádná funkce, která by určila, jestli bude událost poslední, která v tomto časovém období dorazí jako poslední. Aby toho bylo možné dosáhnout, musí být vstupní datový proud připojen k jinému, kde čas události je maximální doba pro všechny události v tomto okně.
Vstup:
| License_plate | Značka | Čas |
|---|---|---|
| DXE 5291 | Značka1 | 2015-07-27T00:00:05Z |
| YZK 5704 | Značka3 | 2015-07-27T00:02:17Z |
| RMV 8282 | Značka1 | 2015-07-27T00:05:01Z |
| YHN 6970 | Značka2 | 2015-07-27T00:06:00Z |
| VFE 1616 | Značka2 | 2015-07-27T00:09:31Z |
| QYF 9358 | Značka1 | 2015-07-27T00:12:02Z |
| MDR 6128 | Značka4 | 2015-07-27T00:13:45Z |
Výstup:
| License_plate | Značka | Čas |
|---|---|---|
| VFE 1616 | Značka2 | 2015-07-27T00:09:31Z |
| MDR 6128 | Značka4 | 2015-07-27T00:13:45Z |
Dotaz:
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
První krok dotazu najde maximální časové razítko v 10minutových časových oknech, které je časovým razítkem poslední události pro toto okno. Druhý krok spojí výsledky prvního dotazu s původním datovým proudem a najde událost, která odpovídá posledním časovým razítkům v každém okně.
DATEDIFF je funkce specifická pro datum, která porovnává a vrací časový rozdíl mezi dvěma poli DateTime. Další informace najdete v tématu o datech.
Další informace o spojování datových proudů najdete v tématu JOIN.
Agregace dat v průběhu času
K výpočtu informací v časovém období je možné data agregovat dohromady. V tomto příkladu se počet vypočítá za posledních 10 sekund času pro každé konkrétní auto.
Vstup:
| Značka | Čas | Hmotnost |
|---|---|---|
| Make1 | 2015-01-01T00:00:01.0000000 Z | 1000 |
| Make1 | 2015-01-01T00:00:02.0000000 Z | 2000 |
| Make2 | 2015-01-01T00:00:04.0000000 Z | 1 500 |
Výstup:
| Značka | Počet |
|---|---|
| Make1 | 2 |
| Make2 | 1 |
Dotaz:
SELECT
Make,
COUNT(*) AS Count
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Tato agregace seskupuje automobily pomocí a počítá je každých 10 sekund. Výstup má na začátku a na počtu vozidel, která se provedla prostřednictvím mýtné.
TumblingWindow je funkce Window, která slouží k seskupení událostí dohromady. Agregaci lze použít pro všechny seskupené události. Další informace najdete v tématu funkce pro okna.
Další informace o agregaci naleznete v tématu agregační funkce.
Periodické výstupní hodnoty
V případě nepravidelných nebo chybějících událostí lze výstup pravidelného intervalu vygenerovat z zhuštěného datového vstupu. Vygenerujte například událost každých 5 sekund, která hlásí poslední zjištěný datový bod.
Vstup:
| Čas | Hodnota |
|---|---|
| "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 |
Výstup (prvních 10 řádků):
| Window_end | Last_event. Interval | Last_event. Osa |
|---|---|---|
| 2014-01-01T14:01:00.000 Z | 2014-01-01T14:01:00.000 Z | 1 |
| 2014-01-01T14:01:05.000 Z | 2014-01-01T14:01:05.000 Z | 2 |
| 2014-01-01T14:01:10.000 Z | 2014-01-01T14:01:10.000 Z | 3 |
| 2014-01-01T14:01:15.000 Z | 2014-01-01T14:01:15.000 Z | 4 |
| 2014-01-01T14:01:20.000 Z | 2014-01-01T14:01:15.000 Z | 4 |
| 2014-01-01T14:01:25.000 Z | 2014-01-01T14:01:15.000 Z | 4 |
| 2014-01-01T14:01:30.000 Z | 2014-01-01T14:01:30.000 Z | 5 |
| 2014-01-01T14:01:35.000 Z | 2014-01-01T14:01:35.000 Z | 6 |
| 2014-01-01T14:01:40.000 Z | 2014-01-01T14:01:35.000 Z | 6 |
| 2014-01-01T14:01:45.000 Z | 2014-01-01T14:01:35.000 Z | 6 |
Dotaz:
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)
Tento dotaz generuje události každých 5 sekund a vypíše poslední událost, která byla dříve přijata. Doba trvání HOPPINGWINDOW určuje, jak daleko se má dotaz Hledat v poslední události.
Další informace najdete v okně skákající.
Korelace událostí v datovém proudu
Korelace událostí ve stejném datovém proudu se dá udělat tak, že si prohlížíte minulé události pomocí funkce Lag . Výstup lze například vygenerovat pokaždé, když dvě po sobě jdoucí automobily ze stejné linky projdou za posledních 90 sekund.
Vstup:
| Značka | License_plate | Čas |
|---|---|---|
| Make1 | ABC – 123 | 2015-01-01T00:00:01.0000000 Z |
| Make1 | AAA-999 | 2015-01-01T00:00:02.0000000 Z |
| Make2 | DEF – 987 | 2015-01-01T00:00:03.0000000 Z |
| Make1 | PŘICHYTÁT-345 | 2015-01-01T00:00:04Z |
Výstup:
| Značka | Čas | Current_car_license_plate | First_car_license_plate | First_car_time |
|---|---|---|---|---|
| Značka1 | 2015-01-01T00:00:02Z | AAA-999 | ABC-123 | 2015-01-01T00:00:01Z |
Dotaz:
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
Funkce LAG se může podívat na vstupní stream o jednu událost zpět a načíst hodnotu Make a porovnat ji s hodnotou Make aktuální události. Po splnit tuto podmínku je možné data z předchozí události projektovat pomocí funkce LAG v příkazu SELECT.
Další informace najdete v tématu LAG.
Zjištění doby trvání mezi událostmi
Dobu trvání události můžete vypočítat pohledem na poslední událost Start po přijetí události End. Tento dotaz může být užitečný k určení času, který uživatel stráví na stránce nebo funkci.
Vstup:
| Uživatel | Funkce | Událost | Čas |
|---|---|---|---|
| user@location.com | RightMenu (Nabídka vpravo) | Spustit | 2015-01-01T00:00:01Z |
| user@location.com | RightMenu (Nabídka vpravo) | End | 2015-01-01T00:00:08Z |
Výstup:
| Uživatel | Funkce | Doba trvání |
|---|---|---|
| user@location.com | RightMenu (Nabídka vpravo) | 7 |
Dotaz:
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'
Funkci LAST lze použít k načtení poslední události v rámci konkrétní podmínky. V tomto příkladu je podmínkou událost typu Start, která rozděluje hledání podle uživatele a funkce PARTITION BY. Tímto způsobem se s každým uživatelem a funkcí zachází nezávisle při hledání události Start. LIMIT DURATION omezuje hledaný čas zpět na 1 hodinu mezi událostmi End a Start.
Počet jedinečných hodnot
Funkce COUNT a DISTINCT se dají použít k počítání jedinečných hodnot polí, které se zobrazí ve streamu v časovém okně. Můžete vytvořit dotaz, který vypočítá, kolik jedinečných automobilů prošlo mýtem ve 2sekudových oknech.
Vstup:
| Značka | Čas |
|---|---|
| Značka1 | 2015-01-01T00:00:01Z |
| Značka1 | 2015-01-01T00:00:02Z |
| Značka2 | 2015-01-01T00:00:01Z |
| Značka2 | 2015-01-01T00:00:02Z |
| Značka2 | 2015-01-01T00:00:03Z |
Výstup:
| Count_make | Čas |
|---|---|
| 2 | 2015-01-01T00:00:02Z |
| 1 | 2015-01-01T00:00:04Z |
Dotaz:
SELECT
COUNT(DISTINCT Make) AS Count_make,
System.TIMESTAMP() AS Time
FROM Input TIMESTAMP BY TIME
GROUP BY
TumblingWindow(second, 2)
FUNKCE COUNT(DISTINCT Make) vrátí počet jedinečných hodnot ve sloupci Vytvořit v časovém okně. Další informace najdete v tématu Agregační funkce COUNT.
Načtení první události v okně
IsFirst lze použít k načtení první události v časovém okně. Příkladem je vystupování informací o prvním automobilu v intervalu 10 minut.
Vstup:
| License_plate | Značka | Čas |
|---|---|---|
| DXE 5291 | Značka1 | 2015-07-27T00:00:05Z |
| YZK 5704 | Značka3 | 2015-07-27T00:02:17Z |
| RMV 8282 | Značka1 | 2015-07-27T00:05:01Z |
| YHN 6970 | Značka2 | 2015-07-27T00:06:00Z |
| VFE 1616 | Značka2 | 2015-07-27T00:09:31Z |
| QYF 9358 | Značka1 | 2015-07-27T00:12:02Z |
| MDR 6128 | Značka4 | 2015-07-27T00:13:45Z |
Výstup:
| License_plate | Značka | Čas |
|---|---|---|
| DXE 5291 | Značka1 | 2015-07-27T00:00:05Z |
| QYF 9358 | Značka1 | 2015-07-27T00:12:02Z |
Dotaz:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) = 1
IsFirst může také rozdělit data a vypočítat první událost na každé konkrétní auto Make nalezené v intervalu 10 minut.
Výstup:
| License_plate | Značka | Čas |
|---|---|---|
| DXE 5291 | Značka1 | 2015-07-27T00:00:05Z |
| YZK 5704 | Značka3 | 2015-07-27T00:02:17Z |
| YHN 6970 | Značka2 | 2015-07-27T00:06:00Z |
| QYF 9358 | Značka1 | 2015-07-27T00:12:02Z |
| MDR 6128 | Značka4 | 2015-07-27T00:13:45Z |
Dotaz:
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) OVER (PARTITION BY Make) = 1
Další informace najdete v tématu IsFirst.
Odebrání duplicitních událostí v okně
Při provádění operace, jako je výpočet průměrů nad událostmi v daném časovém okně, by se měly filtrovat duplicitní události. V následujícím příkladu je druhá událost duplikátem první události.
Vstup:
| DeviceId | Čas | Atribut | Hodnota |
|---|---|---|---|
| 1 | 2018-07-27T00:00:01Z | Teplota | 50 |
| 1 | 2018-07-27T00:00:01Z | Teplota | 50 |
| 2 | 2018-07-27T00:00:01Z | Teplota | 40 |
| 1 | 2018-07-27T00:00:05Z | Teplota | 60 |
| 2 | 2018-07-27T00:00:05Z | Teplota | 50 |
| 1 | 2018-07-27T00:00:10Z | Teplota | 100 |
Výstup:
| AverageValue | DeviceId |
|---|---|
| 70 | 1 |
| 45 | 2 |
Dotaz:
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)
FUNKCE COUNT(DISTINCT Time) vrátí počet jedinečných hodnot ve sloupci Čas v časovém okně. Výstup prvního kroku se pak může použít k výpočtu průměru na zařízení zahozením duplicit.
Další informace najdete v tématu COUNT(DISTINCT Time).
Určení logiky pro různé případy/hodnoty (příkazy CASE)
Příkazy CASE mohou poskytovat různé výpočty pro různá pole na základě konkrétního kritéria. Například přiřaďte dráhu "A" automobilům značky Make1 a dráhu "B" k jakékoli jiné značky.
Vstup:
| Značka | Čas |
|---|---|
| Značka1 | 2015-01-01T00:00:01Z |
| Značka2 | 2015-01-01T00:00:02Z |
| Značka2 | 2015-01-01T00:00:03Z |
Výstup:
| Značka | Dispatch_to_lane | Čas |
|---|---|---|
| Značka1 | "A" | 2015-01-01T00:00:01Z |
| Značka2 | "B" | 2015-01-01T00:00:02Z |
Řešení:
SELECT
Make
CASE
WHEN Make = "Make1" THEN "A"
ELSE "B"
END AS Dispatch_to_lane,
System.TimeStamp() AS Time
FROM
Input TIMESTAMP BY Time
Výraz CASE porovná výraz se sadu jednoduchých výrazů, aby určil jeho výsledek. V tomto příkladu se vozidla make1 odbaví do dráhy "A", zatímco vozidla všech ostatních zozidel budou mít přiřazenou dráhu "B".
Další informace najdete v tématu o výrazu případu.
Převod dat
Data lze přetypovat v reálném čase pomocí metody CAST. Například Tloušťka auta může být převedena z typu nvarchar (max) na typ bigint a lze ji použít pro číselný výpočet.
Vstup:
| Značka | Čas | Hmotnost |
|---|---|---|
| Make1 | 2015-01-01T00:00:01.0000000 Z | "1000" |
| Make1 | 2015-01-01T00:00:02.0000000 Z | "2000" |
Výstup:
| Značka | Hmotnost |
|---|---|
| Make1 | 3000 |
Dotaz:
SELECT
Make,
SUM(CAST(Weight AS BIGINT)) AS Weight
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Použijte příkaz cast k určení jeho datového typu. Podívejte se na seznam podporovaných datových typů u datových typů (Azure Stream Analytics).
Další informace o funkcích pro převod dat.
Zjištění doby trvání podmínky
Pro podmínky, které jsou v rozsahu více událostmi, lze funkci Lag použít k identifikaci doby trvání této podmínky. Předpokládejme například, že chyba byla způsobena tím, že všechna auta mají nesprávnou váhu (nad 20 000 libry) a že se musí vypočítat doba trvání této chyby.
Vstup:
| Značka | Čas | Hmotnost |
|---|---|---|
| Make1 | 2015-01-01T00:00:01.0000000 Z | 2000 |
| Make2 | 2015-01-01T00:00:02.0000000 Z | 250 000 |
| Make1 | 2015-01-01T00:00:03.0000000 Z | 26000 |
| Make2 | 2015-01-01T00:00:04.0000000 Z | 250 000 |
| Make1 | 2015-01-01T00:00:05.0000000 Z | 26000 |
| Make2 | 2015-01-01T00:00:06.0000000 Z | 250 000 |
| Make1 | 2015-01-01T00:00:07.0000000 Z | 26000 |
| Make2 | 2015-01-01T00:00:08.0000000 Z | 2000 |
Výstup:
| Start_fault | End_fault |
|---|---|
| 2015-01-01T00:00:02.000 Z | 2015-01-01T00:00:07.000 Z |
Dotaz:
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
První příkaz Select koreluje aktuální váhu s předchozí měřením a propojuje je s aktuální měření. Druhý Výběr se vrátí k poslední události, kde je previous_weight menší než 20000, přičemž aktuální váha je menší než 20000 a previous_weight aktuální události byla větší než 20000.
End_fault je aktuální nepoškozená událost, u které došlo k chybě předchozí události, a Start_fault je poslední nepoškozená událost.
Zpracování událostí s nezávislým časem (podproudy)
Události mohou docházet pozdě nebo mimo pořadí z důvodu výpadků hodin mezi výrobci událostí, hodinovým zkosením mezi oddíly nebo latencí sítě. Například hodiny zařízení pro TollID 2 jsou pět sekund za TollID 1 a hodiny zařízení pro TollID 3 jsou deset sekund po hodnotě TollID 1. Výpočet může být nezávisle u každého placená linka a zvažuje pouze vlastní data o hodinách jako časové razítko.
Vstup:
| LicensePlate | Značka | Čas | TollID |
|---|---|---|---|
| DXE 5291 | Make1 | 2015 – 07 – 27T00:00:01.0000000 Z | 1 |
| YHN 6970 | Make2 | 2015 – 07 – 27T00:00:05.0000000 Z | 1 |
| QYF 9358 | Make1 | 2015 – 07 – 27T00:00:01.0000000 Z | 2 |
| GXF 9462 | Make3 | 2015 – 07 – 27T00:00:04.0000000 Z | 2 |
| VFE 1616 | Make2 | 2015 – 07 – 27T00:00:10.0000000 Z | 1 |
| RMV 8282 | Make1 | 2015 – 07 – 27T00:00:03.0000000 Z | 3 |
| MDR 6128 | Make3 | 2015 – 07 – 27T00:00:11.0000000 Z | 2 |
| YZK 5704 | Make4 | 2015 – 07 – 27T00:00:07.0000000 Z | 3 |
Výstup:
| TOLLID (ID mýtné linka) | Počet |
|---|---|
| 1 | 2 |
| 2 | 2 |
| 1 | 1 |
| 3 | 1 |
| 2 | 1 |
| 3 | 1 |
Dotaz:
SELECT
TollId,
COUNT(*) AS Count
FROM input
TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId
Klauzule TIMESTAMP OVER BY se na časovou osu jednotlivých zařízení dívá nezávisle pomocí dílčích streamů. Výstupní událost pro každé TOLLID se vygeneruje při výpočtu, což znamená, že události jsou seřazené s ohledem na jednotlivá idllid místo toho, aby se přeuspořádaly, jako by všechna zařízení byla ve stejných hodinách.
Další informace najdete v tématu TIMESTAMP BY OVER.
Relace Windows
Okno relace je okno, které se stále rozšiřuje, když dojde k událostem, a zavře se pro výpočet, pokud se po určité době neobdrží žádná událost nebo pokud okno dosáhne maximální doby trvání. Toto okno je zvlášť užitečné při výpočtu dat interakce uživatele. Okno se spustí, když uživatel začne pracovat se systémem, a zavře se, když se nezaznamenají žádné další události, což znamená, že uživatel přestal interagovat. Uživatel například pracuje s webovou stránkou, na které se zaprotokoluje počet kliknutí, a pomocí okna relace můžete zjistit, jak dlouho uživatel s webem interaguje.
Vstup:
| User_id | Čas | 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" |
Výstup:
| 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 |
Dotaz:
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 pro projektuje data, která jsou relevantní pro interakci uživatele, spolu s dobou trvání interakce. Seskupení dat podle uživatele a okna RelaceWindow, které se zavře, pokud během 1 minuty ne dojde k žádné interakci, s maximální velikostí okna 60 minut.
Další informace o SessionWindow najdete v tématu Okno relace.
Rozšiřitelnost jazyka pomocí uživatelem definované funkce v JavaScriptu a C
Azure Stream Analytics jazyka lze rozšířit o vlastní funkce napsané v jazyce JavaScript nebo C#. Uživatelem definované funkce (UDF) jsou vlastní/složité výpočty, které nelze snadno vyjádřit pomocí SQL jazyka. Tyto uživatelem definované funkce je možné definovat jednou a použít v dotazu vícekrát. Funkce UDF se například může použít k převodu šestnáctkové hodnoty nvarchar(max) na hodnotu bigint.
Vstup:
| Device_id | HexValue |
|---|---|
| 1 | "B4" |
| 2 | "11B" |
| 3 | "121" |
Výstup:
| 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
Uživatelem definovaná funkce vypočítá hodnotu bigint z hodnoty HexValue při každé spotřebované události.
Další informace najdete v tématu JavaScript a C#.
Pokročilé porovnávání vzorů s MATCH_RECOGNIZE
MATCH_RECOGNIZE je pokročilý mechanismus porovnávání vzorů, který lze použít ke spárování posloupnosti událostí s dobře definovaným vzorem regulárního výrazu. Například atm se v reálném čase monitoruje v případě selhání během provozu ATM, pokud se zobrazí dvě po sobě jdoucí varovné zprávy, které musí správce oznámit.
Vstup:
| ATM_id | Operation_id | Return_Code | Čas |
|---|---|---|---|
| 1 | "Entering Pin" (Zadání kódu PIN) | "Success" | 2017-01-26T00:10:00Z |
| 2 | "Opening Money Slot" (Otevření slotu peněz) | "Success" | 2017-01-26T00:10:07Z |
| 2 | "Closing Money Slot" | "Success" | 2017-01-26T00:10:11Z |
| 1 | "EnteringÁt Quantity" | "Success" | 2017-01-26T00:10:08Z |
| 1 | "Opening Money Slot" (Otevření slotu peněz) | "Warning" (Upozornění) | 2017-01-26T00:10:14Z |
| 1 | Tisk bankovního zůstatku | "Warning" (Upozornění) | 2017-01-26T00:10:19Z |
Výstup:
| ATM_id | First_Warning_Operation_id | Warning_Time |
|---|---|---|
| 1 | "Opening Money Slot" (Otevření slotu peněz) | 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
Tento dotaz odpovídá alespoň dvěma po sobě jdoucím událostem selhání a při splnění podmínek vygeneruje alarm. PATTERN definuje regulární výraz, který se má použít pro porovnávání, v tomto případě alespoň dvě po sobě jdoucí upozornění po alespoň jedné úspěšné operaci. Úspěch Return_Code Upozornění se definují pomocí hodnoty Return_Code a po dokončení podmínky se míry projektují pomocí ATM_id , první operace upozornění Return_Code prvního upozornění.
Další informace najdete v tématu MATCH_RECOGNIZE.
Geofencing a geoprostorové dotazy
Azure Stream Analytics poskytuje integrované geoprostorové funkce, které je možné použít k implementaci scénářů, jako je správa vozového parku, sdílení jízd, připojené auta a sledování prostředků. Geoprostorová data je možné ingestovat ve formátech GeoJSON nebo WKT jako součást streamu událostí nebo referenčních dat. Například společnost, která se specializuje na výrobní stroje pro tisk pasů, pronajímá své stroje vládám a vládym. Umístění těchto počítačů je silně kontrolovaným způsobem, aby se zabránilo záměně a možnému použití k padělkům pasů. Každý počítač je vybavený GPS trackerem, který předává informace zpět do Azure Stream Analytics úlohy. Výrobce by chtěl sledovat polohu těchto počítačů a být upozorněn, pokud jeden z nich opustí autorizovaný prostor. Tímto způsobem může vzdáleně zakázat, upozornit autority a načíst vybavení.
Vstup:
| Equipment_id | Equipment_current_location | Čas |
|---|---|---|
| 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 |
Vstup referenčních dat:
| 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)) |
Výstup:
| Equipment_id | Equipment_alert_location | Čas |
|---|---|---|
| 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
Dotaz umožňuje výrobci automaticky monitorovat umístění počítačů a dostávat upozornění, když počítač opustí povolenou geografickou polohu. Integrovaná geoprostorová funkce umožňuje uživatelům používat data GPS v rámci dotazu bez knihoven třetích stran.
Další informace najdete v článku Scénáře geofencingu a geoprostorové agregace s Azure Stream Analytics.
Získání pomoci
Pokud chcete další pomoc, vyzkoušejte naši stránku s&Microsoft Q Azure Stream Analytics.