我在使用Stream Analytics Windowing时遇到了一些麻烦。流分析作业的输入是一个事件流,其中包含来自属于信号的传感器/实体的温度读数。每个信号都有大约600个实体。示例事件看起来像这样。
{
"SignalId": "1",
"EntityId": "1",
"Temperature": 78
}
Stream Analytics正在从参考数据blob读取每个实体的阈值,该参考数据blob看起来像这样。
[{
"SignalId": "1",
"Entities": [{
"Id": 1,
"Threshold": 60
}, {
"Id": 2,
"Threshold": 108
}, {
"Id": 3,
"Threshold": 106
}]
}, {
"SignalId": "2",
"Entities": [{
"Id": 1,
"Threshold": 65
}, {
"Id": 2,
"Threshold": 120
}, {
"Id": 3,
"Threshold": 107
}]
}]
如果温度值大于各自的阈值,我编写了一个Stream Analytics查询来过滤掉事件并在Azure SQL数据库中插入“警报”。
SELECT
e.SignalId AS SignalId,
e.EntityId AS EntityId,
e.Temperature AS AttrValue,
entities.ArrayValue.Threshold AS Threshold,
SYSTEM.TIMESTAMP AS EventTimestamp
INTO
output
FROM
eventhub e
JOIN
referenceblob b
ON
e.SignalId = b.SignalId
CROSS APPLY
GetElements(b.Entities) entities
WHERE
e.EntityId = entities.ArrayValue.Id
AND
e.Temperature > entities.ArrayValue.Threshold
我现在需要的是放置一个滑动窗口(我假设)。如果实体的温度值连续超过其各自的阈值持续1小时,我只想创建“警报”。插入的行应包含与窗口中最后一个事件相关的数据。
我是Stream Analytics和T-SQL的新手,并且说实话,并不完全了解窗口函数的工作原理。这是我的问题......
如果我连续30分钟收到不良事件(温度高于阈值)然后得到一个好事件,是否可以编写一个查询,以便新窗口从下一个错误事件开始?< / p>
是否可以为窗口中的最后一个事件选择数据?我尝试使用LAST()和LAG(),但它给了我一个编译错误,说“不能使用没有聚合函数的GROUP BY”。问题是我不需要聚合函数只是最后的事件值。
我已经坚持这个问题好几天了,任何帮助都会非常感激。
此外,这是我的第一个问题所以请原谅我的无聊
答案 0 :(得分:0)
您可以使用滑动窗口实现此功能。 滑动窗口会在每个事件上生成输出,并回顾所提供的持续时间。在您的示例中,仅当读数低于阈值1小时时才需要输出。像下面这样的查询应该有效。
SELECT
Entity,
max(Reading) MaxReading
INTO
[YourOutputAlias]
FROM
[YourInputAlias]
group by
Entity,
SlidingWindow(hour,1)
having
MaxReading < 100