Azure流分析 - 比较当前事件温度水平是否与之前的事件温度水平相同

问题描述 投票:2回答:1

我已从下游发送设备温度和湿度值,并且在警报或正常状态下有一个ASA用于处理值,以便沉入事件中心。

该设备正在发送温度和湿度信息,其中包含低警告范围,高警告范围,低临界范围和高临界范围。价值是这样的

enter image description here

查询ASA被定义为检测当前温度是否为“正常”,即“警告”或“关键”,此事件将沉入事件中心,其中另一个应用程序将获取此数据以向负责人发送通知警报。警告级别的查询示例是: -

SELECT 
e.IoTHub.ConnectionDeviceId AS DeviceID,
e.Sensorname AS Sensorname,
e.SensorIPAddress AS SensorIPAddress,
CAST(e.Temperature AS FLOAT) AS Temperature,
DATEADD(HH,8,CAST(e.Timestamp AS DATETIME)) AS LocalTime,
CAST(e.TemperatureThreshold.Warning.Low AS FLOAT) AS TempWarningLow,
CAST(e.TemperatureThreshold.Warning.High AS FLOAT) AS TempWarningHigh,
CAST(e.TemperatureThreshold.Critical.Low AS FLOAT) AS TempCriticalLow,
CAST(e.TemperatureThreshold.Critical.High AS FLOAT) AS TempCriticalHigh,
'WARNING' AS ALERT
INTO [TEMP-NOTIFICATION-WARNING] 
FROM [realcoming] AS e
WHERE (CAST(e.Temperature AS FLOAT) <= CAST(e.TemperatureThreshold.Warning.Low AS FLOAT) AND CAST(e.Temperature AS FLOAT) > CAST(e.TemperatureThreshold.Critical.Low AS FLOAT)) OR (CAST(e.Temperature AS FLOAT) >= CAST(e.TemperatureThreshold.Warning.High AS FLOAT) AND Sensorname IS NOT NULL AND 
SensorIPAddress IS NOT NULL AND 
Temperature IS NOT NULL

我在ASA样本测试中测试了样本json文件,它正确显示哪些数据是警告,哪些数据是关键的,哪些数据是正常的: -

{"Sensorname":"Ultrasonic Surface","SensorIPAddress":"10.12.115.18","Temperature":33.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:25.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Infra Red 1A","SensorIPAddress":"10.12.115.35","Temperature":46.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:27.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Infra Red 1A","SensorIPAddress":"10.12.115.35","Temperature":42.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:29.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Laser Room 2B","SensorIPAddress":"10.12.115.20","Temperature":23.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:31.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Laser Room 2B","SensorIPAddress":"10.12.115.20","Temperature":63.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:33.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Laser Room 2B","SensorIPAddress":"10.12.115.20","Temperature":32.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:35.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Laser Room 2B","SensorIPAddress":"10.12.115.20","Temperature":23.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:37.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Room 2A","SensorIPAddress":"10.12.115.11","Temperature":59.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:39.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Laser Room 2B","SensorIPAddress":"10.12.115.20","Temperature":40.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:41.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Infra Red 1A","SensorIPAddress":"10.12.115.35","Temperature":12.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:43.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Infra Red 1A","SensorIPAddress":"10.12.115.35","Temperature":54.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:45.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Room 2A","SensorIPAddress":"10.12.115.11","Temperature":64.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:47.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Ultrasonic Surface","SensorIPAddress":"10.12.115.18","Temperature":78.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:49.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Laser Room 2B","SensorIPAddress":"10.12.115.20","Temperature":64.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:51.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Infra Red 1A","SensorIPAddress":"10.12.115.35","Temperature":64.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:53.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}
{"Sensorname":"Laser Room 2B","SensorIPAddress":"10.12.115.20","Temperature":35.0,"TemperatureThreshold":{"Warning":{"Low":"20","High":"80"},"Critical":{"Low":"10","High":"90"}},"Timestamp":"2016-12-20T13:15:55.0000000Z","IoTHub":{"ConnectionDeviceId":"TEMP001"}}

每个事件之间的间隔是2分钟。因此,如果第一个事件是“警告”,它将下沉到事件中心,如果下一个事件仍然是“警告”,则事件将被跳过,因为如果达到第一个“警告”或“关键”,用户需要一次通知。

我有搜索并发现与之前的事件进行比较,我需要在查询中使用“LAG”。

LAG(CAST(e.Temperature AS FLOAT) <= CAST(e.TemperatureThreshold.Warning.Low AS FLOAT) AND CAST(e.Temperature AS FLOAT) > CAST(e.TemperatureThreshold.Critical.Low AS FLOAT)) OR (CAST(e.Temperature AS FLOAT) >= CAST(e.TemperatureThreshold.Warning.High AS FLOAT)) OVER (PARTITION BY Temperature LIMIT DURATION(minute, 2))

但是这个查询格式失败了。如果我只知道静态设置的“警告”如何在之前的事件中可用,那么我只能比较可以缩短查询的“ALERT”变量。

“ALERT”变量设置为static。谁知道如何比较?

一个简单的问题: - 我们在查询中定义的任何内容是否会传递给上一个事件?或者之前的活动是否仅包含来自IoT Hub的信息?在我的情况下,如果温度处于“警告”状态,在之前的事件中,它将具有“警告”值的“警告”吗?

我的参考文章:

https://msdn.microsoft.com/en-us/library/azure/dn966240.aspx

https://stackoverflow.com/questions/36525338/azure-stream-analytics-with-lag-statement-generates-two-output-events-for-every

https://talkingaboutdata.wordpress.com/2015/08/13/azure-streaming-analytics-lag-function-with-example/

azure azure-stream-analytics
1个回答
0
投票

你LAG方法有语法问题,Check LAG参数。

我刚刚在ASA查询窗口中修改了您的查询并修复了语法错误。

SELECT 
e.IoTHub.ConnectionDeviceId AS DeviceID,
e.Sensorname AS Sensorname,
e.SensorIPAddress AS SensorIPAddress,
CAST(e.Temperature AS FLOAT) AS Temperature,
DATEADD(HH,8,CAST(e.Timestamp AS DATETIME)) AS LocalTime,
CAST(e.TemperatureThreshold.Warning.Low AS FLOAT) AS TempWarningLow,
CAST(e.TemperatureThreshold.Warning.High AS FLOAT) AS TempWarningHigh,
CAST(e.TemperatureThreshold.Critical.Low AS FLOAT) AS TempCriticalLow,
CAST(e.TemperatureThreshold.Critical.High AS FLOAT) AS TempCriticalHigh,
'WARNING' AS ALERT
INTO
[TEMP-NOTIFICATION-WARNING]
FROM
[realcoming] AS e

WHERE 
(
CAST(e.Temperature AS FLOAT) <= CAST(e.TemperatureThreshold.Warning.Low AS FLOAT) 
AND CAST(e.Temperature AS FLOAT) > CAST(e.TemperatureThreshold.Critical.Low AS FLOAT)
)
OR 
(CAST(e.Temperature AS FLOAT) >= CAST(e.TemperatureThreshold.Warning.High AS FLOAT) 
AND Sensorname IS NOT NULL AND SensorIPAddress IS NOT NULL AND 
Temperature IS NOT NULL
)
AND LAG(CAST(e.Temperature AS FLOAT)) OVER (PARTITION BY e.IoTHub.ConnectionDeviceId 
LIMIT DURATION(minute, 2)) >= 
CAST(e.TemperatureThreshold.Warning.Low AS FLOAT) 

如果您想使用LAG方法添加多个条件,我建议您使用WITH编写查询,然后使用其他条件,它将使您的查询更具可读性和可维护性。

© www.soinside.com 2019 - 2024. All rights reserved.