Azure流分析窗口

时间:2016-12-16 08:39:38

标签: tsql azure complex-event-processing stream-analytics

我在使用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的新手,并且说实话,并不完全了解窗口函数的工作原理。这是我的问题......

  1. 如果我连续30分钟收到不良事件(温度高于阈值)然后得到一个好事件,是否可以编写一个查询,以便新窗口从下一个错误事件开始?< / p>

  2. 是否可以为窗口中的最后一个事件选择数据?我尝试使用LAST()和LAG(),但它给了我一个编译错误,说“不能使用没有聚合函数的GROUP BY”。问题是我不需要聚合函数只是最后的事件值。

  3. 我已经坚持这个问题好几天了,任何帮助都会非常感激。

    此外,这是我的第一个问题所以请原谅我的无聊

1 个答案:

答案 0 :(得分:0)

您可以使用滑动窗口实现此功能。 滑动窗口会在每个事件上生成输出,并回顾所提供的持续时间。在您的示例中,仅当读数低于阈值1小时时才需要输出。像下面这样的查询应该有效。

SELECT
    Entity,
    max(Reading) MaxReading
INTO
    [YourOutputAlias]
FROM
    [YourInputAlias]
group by
    Entity,
    SlidingWindow(hour,1)
having
    MaxReading < 100