Patrones de consulta comunes en Azure Stream Analytics
Las consultas de Azure Stream Analytics se expresan en un lenguaje de consulta similar a SQL. Estas construcciones de lenguaje se documentan en la guía Referencia de lenguaje de consulta de Stream Analytics.
El diseño de consultas puede expresar una lógica sencilla de paso a través para mover datos de evento desde un flujo de entrada a un almacén de datos de salida, o puede hacer la coincidencia de patrones enriquecidos y análisis temporal para calcular los agregados durante distintas ventanas de horarios como en la guía Compilación de una solución de IoT con Stream Analytics. Puede combinar datos de varias entradas para combinar eventos de streaming y realizar búsquedas en datos de referencia estáticos que enriquecerán los valores de evento. También puede escribir datos en varias salidas.
En este artículo se describen las soluciones para varios patrones de consulta comunes basados en situaciones del mundo real.
Formatos de datos compatibles
Azure Stream Analytics admite eventos de procesamiento en formatos de datos CSV, JSON y Avro.
Tanto JSON como Avro pueden contener tipos complejos como objetos anidados (registros) o matrices. Para obtener más información sobre cómo trabajar con estos tipos de datos complejos, consulte el artículo Análisis de datos JSON y AVRO.
Envío de datos a varias salidas
Se pueden usar varias instrucciones SELECT para generar datos en distintos receptores de salida. Por ejemplo, una instrucción SELECT puede generar una alerta basada en umbral, mientras que otra puede generar eventos en el almacenamiento de blobs.
Entrada:
| Asegúrese | Time |
|---|---|
| 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 |
Salida ArchiveOutput:
| Asegúrese | Time |
|---|---|
| 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 |
Salida AlertOutput:
| Asegúrese | Time | Count |
|---|---|---|
| Make2 | 2015-01-01T00:00:10Z | 3 |
Consultar
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
La cláusula INTO indica a Stream Analytics en cuál de las salidas se escribirán los datos. La primera instrucción SELECT define una consulta de paso a través que recibe datos de la entrada y los envía a la salida denominada ArchiveOutput. La segunda consulta hace una agregación y un filtrado simples, antes de enviar los resultados a la salida de un sistema de alertas descendente, denominada AlertOutput.
Tenga en cuenta que se puede usar la cláusula WITH para definir varios bloques de subconsultas. Esta opción ofrece la ventaja de tener que abrir menos lectores para el origen de entrada.
Consultar
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
Para más información, consulte la cláusula WITH.
Consulta de paso a través simple
Se puede usar una consulta de paso a través simple para copiar los datos del flujo de entrada en la salida. Por ejemplo, si un flujo de datos que contiene información sobre vehículos en tiempo real debe guardarse en una base de datos SQL para un análisis de letras, una consulta de paso a través simple podrá encargarse de la tareas.
Entrada:
| Asegúrese | Time | Peso |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | "1000" |
| Make1 | 2015-01-01T00:00:02Z | "2000" |
Salida:
| Asegúrese | Time | Peso |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | "1000" |
| Make1 | 2015-01-01T00:00:02Z | "2000" |
Consultar
SELECT
*
INTO Output
FROM Input
Una consulta SELECT * proyecta todos los campos de un evento entrante y los envía a la salida. Del mismo modo, SELECT también puede usarse para proyectar solo los campos obligatorios de la entrada. En este ejemplo, si Make y Time del vehículo son los únicos campos obligatorios que se van a guardar, esos campos se pueden especificar en la instrucción SELECT.
Entrada:
| Asegúrese | Time | Peso |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | 1000 |
| Make1 | 2015-01-01T00:00:02Z | 2000 |
| Make2 | 2015-01-01T00:00:04Z | 1.500 |
Salida:
| Asegúrese | Time |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make1 | 2015-01-01T00:00:02Z |
| Make2 | 2015-01-01T00:00:04Z |
Consultar
SELECT
Make, Time
INTO Output
FROM Input
Coincidencia de cadenas con LIKE y NOT LIKE
LIKE y NOT LIKE se pueden usar para verificar si un campo coincide con un patrón determinado. Por ejemplo, se puede crear un filtro para devolver solo las matrículas que comienzan con la letra "A" y terminan con el número 9.
Entrada:
| Asegúrese | License_plate | Time |
|---|---|---|
| Make1 | ABC-123 | 2015-01-01T00:00:01Z |
| Make2 | AAA-999 | 2015-01-01T00:00:02Z |
| Make3 | ABC-369 | 2015-01-01T00:00:03Z |
Salida:
| Asegúrese | License_plate | Time |
|---|---|---|
| Make2 | AAA-999 | 2015-01-01T00:00:02Z |
| Make3 | ABC-369 | 2015-01-01T00:00:03Z |
Consultar
SELECT
*
FROM
Input TIMESTAMP BY Time
WHERE
License_plate LIKE 'A%9'
Use la instrucción LIKE para comprobar el valor del campo License_plate. Debe comenzar con la letra "A", seguida de cualquier cadena de ceros o más caracteres y terminar con el número 9.
Cálculo con eventos pasados
La función LAG se puede usar para ver los eventos pasados dentro de una ventana de tiempo y compararlos con el evento actual. Por ejemplo, se puede obtener la marca del vehículo actual si difiere de la del último automóvil que pasó por el peaje.
Entrada:
| Asegúrese | Time |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make2 | 2015-01-01T00:00:02Z |
Salida:
| Asegúrese | Time |
|---|---|
| Make2 | 2015-01-01T00:00:02Z |
Consultar
SELECT
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make
Utilice LAG para observar el flujo de entrada del evento anterior, recuperar el valor de Make y compararlo con el valor de Make del evento actual y emitir el evento.
Para obtener más información, consulte LAG.
Devolución del último evento en una ventana
Dado que el sistema consume los eventos en tiempo real, no hay ninguna función que pueda determinar si un evento será el último en llegar para ese período de tiempo. Para ello, el flujo de entrada debe unirse con otro, donde el tiempo de un evento sea el tiempo máximo para todos los eventos de esa ventana.
Entrada:
| License_plate | Asegúrese | Time |
|---|---|---|
| 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 |
Salida:
| License_plate | Asegúrese | Time |
|---|---|---|
| VFE 1616 | Make2 | 2015-07-27T00:09:31Z |
| MDR 6128 | Make4 | 2015-07-27T00:13:45Z |
Consultar
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
El primer paso de la consulta encuentra la marca de tiempo máxima en ventanas de 10 minutos, que es la marca de tiempo del último evento para esa ventana. El segundo paso combina los resultados de la primera consulta con el flujo original para buscar el evento que coincide con las últimas marcas de tiempo en cada ventana.
DATEDIFF es una función específica de fecha que compara y devuelve la diferencia temporal entre dos campos DateTime. Para obtener más información, consulte las funciones de fecha.
Para obtener más información sobre cómo combinar flujos, consulte JOIN.
Agregación de datos a lo largo del tiempo
Para procesar información en un período de tiempo, los datos se pueden agregar juntos. En este ejemplo, un recuento se calcula en los últimos 10 segundos de tiempo por cada marca de coche específica.
Entrada:
| Asegúrese | Time | Peso |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | 1000 |
| Make1 | 2015-01-01T00:00:02Z | 2000 |
| Make2 | 2015-01-01T00:00:04Z | 1.500 |
Salida:
| Asegúrese | Count |
|---|---|
| Make1 | 2 |
| Make2 | 1 |
Consultar
SELECT
Make,
COUNT(*) AS Count
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Esta agregación agrupa los automóviles por Make y los cuenta cada 10 segundos. La salida tiene los valores de Make y Count de automóviles que han pasado por el peaje.
TumblingWindow es una función de ventana que se utiliza para agrupar eventos. Se puede aplicar una agregación a todos los eventos agrupados. Para más información, consulte las funciones de ventana.
Para más información sobre la agregación, consulte funciones de agregado.
Emisión periódica de valores
En caso de eventos irregulares o ausentes, se puede generar una salida de intervalo periódico a partir de una entrada de datos más dispersa. Por ejemplo, genere un evento cada cinco segundos que notifique el punto de datos visto más recientemente.
Entrada:
| Time | Value |
|---|---|
| "2014-01-01T06:01:00" | 1 |
| "2014-01-01T06:01:05" | 2 |
| "2014-01-01T06:01:10" | 3 |
| "2014-01-01T06:01:15" | 4 |
| "2014-01-01T06:01:30" | 5 |
| "2014-01-01T06:01:35" | 6 |
Salida (10 primeras filas) :
| Window_end | Last_event.Time | Last_event.Value |
|---|---|---|
| 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 |
Consultar
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)
Esta consulta genera eventos cada cinco segundos y genera como resultado el último evento que se recibió anteriormente. La duración HOPPINGWINDOW determina cuánto tiempo atrás buscará la consulta para encontrar el evento más reciente.
Para más información, consulte Ventana de salto.
Correlación de eventos en un flujo
La correlación de eventos en el mismo flujo se puede realizar observando los eventos pasados con la función LAG. Por ejemplo, se puede generar una salida cada vez que dos automóviles consecutivos con el mismo valor de Make pasan por el peaje durante los últimos 90 segundos.
Entrada:
| Asegúrese | License_plate | Time |
|---|---|---|
| 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 | GHI-345 | 2015-01-01T00:00:04Z |
Salida:
| Asegúrese | Time | 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 |
Consultar
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
La función LAG puede observar el flujo de entrada del evento anterior y recuperar el valor de Make, y compararlo con el valor de Make del evento actual. Una vez que se cumple la condición, se pueden proyectar los datos del evento anterior mediante LAG en la instrucción SELECT.
Para obtener más información, consulte LAG.
Detección de la duración entre eventos
La duración de un evento se puede calcular examinando el último evento Start una vez que se recibe un evento End. Esta consulta puede resultar útil para determinar el tiempo que un usuario emplea en una página o una característica.
Entrada:
| Usuario | Característica | Evento | Time |
|---|---|---|---|
| user@location.com | RightMenu | Start | 2015-01-01T00:00:01Z |
| user@location.com | RightMenu | End | 2015-01-01T00:00:08Z |
Salida:
| Usuario | Característica | Duration |
|---|---|---|
| user@location.com | RightMenu | 7 |
Consultar
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'
La función LAST se puede usar para recuperar el último evento dentro de una condición específica. En este ejemplo, la condición es un evento de tipo Start, donde la búsqueda se particiona mediante el usuario y la característica PARTITION BY. De este modo, cada usuario y característica se tratan de forma independiente al buscar el evento Start. LIMIT DURATION limita la búsqueda en el tiempo a 1 hora entre los eventos End y Start.
Recuento de valores únicos
COUNT y DISTINCT pueden usarse para contar el número de valores de campo únicos que aparecen en la transmisión durante un período de tiempo determinado. Puede crearse una consulta para calcular cuántas marcas de vehículos únicas pasan por la cabina de peaje en una ventana de 2 segundos.
Entrada:
| Asegúrese | Time |
|---|---|
| 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 |
Salida:
| Count_make | Time |
|---|---|
| 2 | 2015-01-01T00:00:02Z |
| 1 | 2015-01-01T00:00:04Z |
Consulta:
SELECT
COUNT(DISTINCT Make) AS Count_make,
System.TIMESTAMP() AS Time
FROM Input TIMESTAMP BY TIME
GROUP BY
TumblingWindow(second, 2)
COUNT(DISTINCT Make) devuelve la cantidad de valores distintos de la columna Make dentro de una ventana de tiempo. Para más información, consulte la función de agregado COUNT.
Recuperación del primer evento en una ventana
Se puede usar IsFirst para recuperar el primer evento en una ventana de tiempo. Por ejemplo, para emitir la información del primer automóvil en cada intervalo de 10 minutos.
Entrada:
| License_plate | Asegúrese | Time |
|---|---|---|
| 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 |
Salida:
| License_plate | Asegúrese | Time |
|---|---|---|
| DXE 5291 | Make1 | 2015-07-27T00:00:05Z |
| QYF 9358 | Make1 | 2015-07-27T00:12:02Z |
Consultar
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) = 1
Además, IsFirst puede particionar los datos y calcular el primer evento para cada Make de automóvil específico que encuentre en cada intervalo de 10 minutos.
Salida:
| License_plate | Asegúrese | Time |
|---|---|---|
| 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 |
Consultar
SELECT
License_plate,
Make,
Time
FROM
Input TIMESTAMP BY Time
WHERE
IsFirst(minute, 10) OVER (PARTITION BY Make) = 1
Para obtener más información, consulte IsFirst.
Quitar eventos duplicados de una ventana
Al realizar una operación, como calcular promedios de eventos en un período de tiempo determinado, se deben filtrar los eventos duplicados. En el ejemplo siguiente, el segundo evento es un duplicado del primero.
Entrada:
| deviceId | Time | Atributo | Valor |
|---|---|---|---|
| 1 | 2018-07-27T00:00:01Z | Temperatura | 50 |
| 1 | 2018-07-27T00:00:01Z | Temperatura | 50 |
| 2 | 2018-07-27T00:00:01Z | Temperatura | 40 |
| 1 | 2018-07-27T00:00:05Z | Temperatura | 60 |
| 2 | 2018-07-27T00:00:05Z | Temperatura | 50 |
| 1 | 2018-07-27T00:00:10Z | Temperatura | 100 |
Salida:
| AverageValue | deviceId |
|---|---|
| 70 | 1 |
| 45 | 2 |
Consultar
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) devuelve el número de valores distintos de la columna Time dentro de una ventana de tiempo. La salida del primer paso puede usarse para calcular el promedio por dispositivo, descartando los duplicados.
Para más información, consulte COUNT(DISTINCT Time).
Especificación de la lógica para los distintos casos/valores (instrucciones CASE)
Las instrucciones CASE pueden proporcionar diferentes cálculos para distintos campos, en función de un criterio determinado. Por ejemplo, asigne el carril "A" a los automóviles de Make1 y el carril "B" a cualquier otra marca.
Entrada:
| Asegúrese | Time |
|---|---|
| Make1 | 2015-01-01T00:00:01Z |
| Make2 | 2015-01-01T00:00:02Z |
| Make2 | 2015-01-01T00:00:03Z |
Salida:
| Asegúrese | Dispatch_to_lane | Time |
|---|---|---|
| Make1 | "A" | 2015-01-01T00:00:01Z |
| Make2 | "B" | 2015-01-01T00:00:02Z |
Solución:
SELECT
Make
CASE
WHEN Make = "Make1" THEN "A"
ELSE "B"
END AS Dispatch_to_lane,
System.TimeStamp() AS Time
FROM
Input TIMESTAMP BY Time
La expresión CASE compara una expresión con un conjunto de expresiones simples para determinar el resultado. En este ejemplo, los vehículos de Make1 se envían al carril "A", mientras que los vehículos de cualquier otra marca se asignarán al carril "B".
Para más información, consulte la expresión CASE.
Conversión de datos
Los datos se pueden convertir en tiempo real mediante el método CAST. Por ejemplo, el peso del automóvil se puede convertir del tipo nvarchar(max) al tipo bigint y usarse en un cálculo numérico.
Entrada:
| Asegúrese | Time | Peso |
|---|---|---|
| Make1 | 2015-01-01T00:00:01Z | "1000" |
| Make1 | 2015-01-01T00:00:02Z | "2000" |
Salida:
| Asegúrese | Peso |
|---|---|
| Make1 | 3000 |
Consultar
SELECT
Make,
SUM(CAST(Weight AS BIGINT)) AS Weight
FROM
Input TIMESTAMP BY Time
GROUP BY
Make,
TumblingWindow(second, 10)
Use una instrucción CAST para especificar su tipo de datos. Vea la lista de tipos de datos admitidos en Tipos de datos (Azure Stream Analytics).
Para más información, consulte las funciones de conversión de tipos.
Detección de la duración de una condición
En el caso de las condiciones que abarcan varios eventos, se puede usar la función LAG para identificar la duración de esa condición. Por ejemplo, supongamos que por error todos los vehículos tienen un peso incorrecto (por encima de 20 000 libras), y debe calcularse la duración del error.
Entrada:
| Asegúrese | Time | Peso |
|---|---|---|
| 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 |
Salida:
| Start_fault | End_fault |
|---|---|
| 2015-01-01T00:00:02Z | 2015-01-01T00:00:07Z |
Consultar
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
La primera instrucción SELECT correlaciona la medida de peso actual con la medida anterior, y la proyecta junto con la medida actual. La segunda SELECT vuelve a observar el último evento donde previous_weight es inferior a 20000, donde el peso actual es menor que 20000, y previous_weight del evento actual era mayor que 20000.
End_fault es el evento actual sin errores donde el evento anterior presentaba errores, y Start_fault es el último evento sin errores anterior a ese.
Procesamiento de eventos con tiempo independiente (subflujos)
Los eventos pueden llegar tarde o desordenados debido a sesgos de reloj entre los productores de eventos, a sesgos de reloj entre particiones o a la latencia de red. Por ejemplo, el reloj del dispositivo para TollID 2 va cinco segundos atrasado respecto a TollID 1, y el reloj del dispositivo para TollID 3 va diez segundos atrasado respecto a TollID 1. Se puede generar un cálculo de forma independiente para cada peaje, teniendo en cuenta solo sus propios datos de reloj como marca de tiempo.
Entrada:
| LicensePlate | Asegúrese | Time | 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 |
Salida:
| TollId | Count |
|---|---|
| 1 | 2 |
| 2 | 2 |
| 1 | 1 |
| 3 | 1 |
| 2 | 1 |
| 3 | 1 |
Consultar
SELECT
TollId,
COUNT(*) AS Count
FROM input
TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId
La cláusula TIMESTAMP BY OVER examina la escala de tiempo de cada dispositivo de manera independiente mediante subflujos. Los eventos de salida para cada TollID se generan a medida que se calculan, lo que significa que los eventos están en orden con respecto a cada TollID, en lugar de que se vuelvan a ordenar como si todos los dispositivos estuvieran en el mismo reloj.
Para más información, consulte este TIMESTAMP BY OVER.
Ventanas de sesión
Una ventana de sesión es una ventana que se expande a medida que se producen eventos y se cierra para el cálculo si no se recibe ningún evento después de un período de tiempo específico, o si la ventana alcanza su duración máxima. Esta ventana resulta especialmente útil al calcular datos de interacción de un usuario. Una ventana se inicia cuando un usuario empieza a interactuar con el sistema y se cierra cuando no se observan más eventos; es decir, que el usuario ha dejado de interactuar. Por ejemplo, un usuario interactúa con una página web donde se registra el número de clics; se puede usar una ventana de sesión para averiguar cuánto tiempo ha interactuado el usuario con el sitio.
Entrada:
| User_id | Time | URL |
|---|---|---|
| 0 | 2017-01-26T00:00:00Z | "www.ejemplo.com/a.html" |
| 0 | 2017-01-26T00:00:20Z | "www.ejemplo.com/b.html" |
| 1 | 2017-01-26T00:00:55Z | "www.ejemplo.com/c.html" |
| 0 | 2017-01-26T00:01:10Z | "www.ejemplo.com/d.html" |
| 1 | 2017-01-26T00:01:15Z | "www.ejemplo.com/e.html" |
Salida:
| 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 |
Consultar
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 proyecta los datos pertinentes a la interacción del usuario, junto con la duración de la interacción. Agrupa los datos por usuario y una SessionWindow que se cierra si no se produce ninguna interacción en 1 minuto, con un tamaño máximo de la ventana de 60 minutos.
Para obtener más información sobre SessionWindow, consulte Ventana de sesión.
Extensibilidad del lenguaje con la función definida por el usuario en JavaScript y C#
El lenguaje de consultas de Azure Stream Analytics se puede ampliar con funciones personalizadas escritas en los lenguajes JavaScript o C#. Las funciones definidas por el usuario (UDF) son cálculos personalizados o complejos que no se pueden expresar fácilmente mediante el lenguaje SQL. Estas UDF se pueden definir una vez y usarse varias veces dentro de una consulta. Por ejemplo, se puede usar una UDF para convertir un valor hexadecimal nvarchar(max) en un valor bigint.
Entrada:
| Device_id | HexValue |
|---|---|
| 1 | "B4" |
| 2 | "11B" |
| 3 | "121" |
Salida:
| 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
La función definida por el usuario calculará el valor bigint de HexValue en cada evento consumido.
Para más información, consulte JavaScript y C#.
Coincidencia de patrones avanzada con MATCH_RECOGNIZE
MATCH_RECOGNIZE es un mecanismo de coincidencia de patrones avanzada que se puede usar para hacer coincidir una secuencia de eventos con un patrón de expresión regular bien definido. Por ejemplo, se supervisa un cajero automático en tiempo real en busca de errores, durante el funcionamiento del cajero, si hay dos mensajes de advertencia consecutivos, debe darse aviso al administrador.
Entrada:
| ATM_id | Operation_id | Return_Code | Time |
|---|---|---|---|
| 1 | "Introducción de PIN" | "Success" | 2017-01-26T00:10:00Z |
| 2 | "Apertura del dispensador de dinero" | "Success" | 2017-01-26T00:10:07Z |
| 2 | "Cierre del dispensador de dinero" | "Success" | 2017-01-26T00:10:11Z |
| 1 | "Introducción de la cantidad del retiro" | "Success" | 2017-01-26T00:10:08Z |
| 1 | "Apertura del dispensador de dinero" | "Warning" | 2017-01-26T00:10:14Z |
| 1 | "Impresión del saldo bancario" | "Warning" | 2017-01-26T00:10:19Z |
Salida:
| ATM_id | First_Warning_Operation_id | Warning_Time |
|---|---|---|
| 1 | "Apertura del dispensador de dinero" | 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
Esta consulta coincide al menos con dos eventos de error consecutivos y genera una alarma cuando se cumplen las condiciones. PATTERN define la expresión regular que se utilizará en la búsqueda de coincidencias, en este caso, al menos dos advertencias consecutivas después de una operación correcta como mínimo. Success y Warning se definen mediante el valor Return_Code y, una vez que se cumple la condición, MEASURES se proyectan con ATM_id, la primera operación de advertencia y la primera hora de advertencia.
Para obtener más información, consulte MATCH_RECOGNIZE.
Consultas de geovalla y geoespaciales
Azure Stream Analytics proporciona funciones geoespaciales integradas que se pueden usar para implementar escenarios como, por ejemplo, la administración de flotas, transporte compartido, automóviles conectados y seguimiento de recursos. Los datos geoespaciales se pueden ingerir en formato GeoJSON o WKT como parte del flujo de eventos o datos de referencia. Por ejemplo, una empresa especializada en la fabricación de máquinas para imprimir pasaportes, alquila sus equipos a Gobiernos y consulados. La ubicación de esas máquinas está muy controlada a fin de evitar su extravío y el uso posible para la falsificación de pasaportes. Cada máquina está equipada con un rastreador GPS, cuya información se retransmite a un trabajo de Azure Stream Analytics. El fabricante quiere realizar un seguimiento de la ubicación de esas máquinas y recibir una alerta si una de ellas abandona un área autorizada, de manera que puedan deshabilitarla de forma remota, alertar a las autoridades y recuperar el equipo.
Entrada:
| Equipment_id | Equipment_current_location | Time |
|---|---|---|
| 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 |
Entrada de datos de referencia:
| 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))" |
Salida:
| Equipment_id | Equipment_alert_location | Time |
|---|---|---|
| 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
La consulta permite al fabricante supervisar la ubicación de los equipos automáticamente y recibir alertas cuando una máquina abandona la geovalla permitida. La función geoespacial integrada permite a los usuarios usar datos GPS dentro de la consulta sin bibliotecas de terceros.
Para más información, consulte el artículo Escenarios de agregación geoespacial y de geovalla con Azure Stream Analytics.
Obtener ayuda
Para más ayuda, pruebe nuestra Página de preguntas y respuestas de Microsoft sobre Azure Stream Analytics.