在我的Azure流分析作业中,我想为每个设备创建一个窗口(当接收到设备的数据时)。我正在使用会话窗口为每个设备维护一个单独的窗口。我希望每5分钟发出一次温度阈值突破警报,但有时行为会有所不同。下面是我的ASA JOB查询
SELECT
t1.DeviceId,MIN(t1.Temperature)MinTemperature,
MAX(t1.Temperature)MaxTemperature,t2.ThresholdLimit,System.Timestamp as
EventProcessedUtcTime,t3.EventProcessedUtcTime as LastAlertTime
,MIN(CAST(t1.MessageTime AS DateTime)) AS Window_start,
System.Timestamp AS Window_end,Count(t1.DeviceId)EventCount
INTO
[alertOutputsb]
FROM
[tsfInput] t1
INNER JOIN [device-threashold-Input] t2
ON t1.DeviceId = t2.DeviceId
LEFT OUTER JOIN [temperature-alerts-sql-Input] t3
ON t1.DeviceId = t3.DeviceId
WHERE t1.Temperature >= Cast(t2.ThresholdLimit as float)
GROUP BY t1.DeviceId,t2.ThresholdLimit,t3.EventProcessedUtcTime,
SESSIONWINDOW(minute, 4, 5) OVER (PARTITION BY t1.DeviceId)
HAVING MIN(t1.Temperature) >= Cast(t2.ThresholdLimit as float)
AND MAX(t1.Temperature) >= Cast(t2.ThresholdLimit as float)
InputJSON 我每隔1分钟发送一次设备数据。
{
"DeviceId": "9327848923ABE",
"Temperature": 300.5,
"MessageTime": "2019-03-02T05:50:05.362Z"
}
对于设备-9327848923ABE,我在10分钟内收到了第一个警报,然后在5分钟内又收到了所有警报。
答案 0 :(得分:0)
Azure Stream Analytics是管理会话窗口的方法:
会话窗口将在相同时间到达的事件分组,进行过滤 没有数据的时间段。会话窗口功能 有三个主要参数:超时,最大持续时间和分区 键(可选)。
下图说明了具有一系列事件和 如何将它们映射到5分钟超时的会话窗口中,以及 最长持续10分钟。
当第一个事件发生时,会话窗口开始。如果另一个事件 发生在从上一次摄取的事件起的指定超时内,然后 窗口将扩展为包括新事件。否则,如果没有事件 在超时内发生,然后在超时时关闭窗口。
如果事件在指定的超时时间内持续发生,则会话 窗口将一直扩展直到达到最大持续时间。请 请注意,最大持续时间检查间隔设置为 与指定的最大持续时间相同的大小。例如,如果最大 持续时间是10,然后检查窗口是否超过最大 持续时间将发生在t = 0、10、20、30等处。
因此,从数学上讲,如果以下情况,我们的会话窗口结束 条件满足:
Stream Analytics会话窗口5分钟超时,最多10分钟
提供分区键后,事件通过以下方式分组在一起 密钥和会话窗口将分别应用于每个组。 这在需要不同会话窗口的情况下很有用 不同的用户或设备。
这是语法:
SESSIONWINDOW(timeunit, timeoutSize, maxDurationSize) [OVER (PARTITION BY partitionKey)]
SESSIONWINDOW(Timeout(timeunit , timeoutSize), MaxDuration(timeunit, maxDurationSize)) [OVER (PARTITION BY partitionKey)]
说明:
timeoutsize
一个大整数,描述会话窗口的间隙大小。数据 间隙大小内发生的事件在同一位置分组 窗口。
maxdurationsize
如果窗口总大小超过指定的maxDurationSize 检查点,然后关闭窗口并打开一个新窗口 在同一点上。目前,检查间隔的大小为 等于maxDurationSize。
分区键
一个可选参数,指定会话窗口的键 操作结束。如果指定,则窗口将仅组合在一起 相同键的事件。
示例: JSON:
[
// time: the timestamp when the user clicks on the link
// user_id: the id of the user
// url: the url the user clicked on
{
"time": "2017-01-26T00:00:00.0000000z",
"user_id": 0,
"url": "www.example.com/a.html"
},
{
"time": "2017-01-26T00:00:20.0000000z",
"user_id": 0,
"url": "www.example.com/b.html"
},
{
"time": "2017-01-26T00:00:55.0000000z",
"user_id": 1,
"url": "www.example.com/c.html"
},
// ...
]
要测量每个用户会话的持续时间,可以使用以下查询:
CREATE TABLE localinput(time DATETIME, user_id BIGINT, url NVARCHAR(MAX))
SELECT
user_id,
MIN(time) AS window_start,
System.Timestamp AS window_end,
DATEDIFF(s, MIN(time), System.Timestamp) AS duration_in_seconds
FROM localinput TIMESTAMP BY time
GROUP BY user_id, SessionWindow(minute, 2, 60) OVER (PARTITION BY user_id)
前面的查询创建一个超时为2的会话窗口 分钟,最长持续时间为60分钟,分区键为 用户身份。这意味着将为创建独立的会话窗口 每个user_id。对于每个窗口,此查询将生成输出, 包含user_id,窗口的开始时间(window_start), 窗口的结尾(window_end)和用户的总持续时间 会话(duration_in_seconds)。
这非常简单,如果遇到困难,请从头开始。