2016-12-16 72 views
0

我在流分析窗口方面遇到了一些麻煩。我的流分析作業的輸入是一個事件流,其中包含來自屬於信號的傳感器/實體的溫度讀數。每個信號都有大約600個實體。示例事件看起來像這樣。Azure流分析窗口

{ 
    "SignalId": "1", 
    "EntityId": "1", 
    "Temperature": 78 
} 

流分析正在從參考數據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 
    }] 
}] 

我寫了一個流分析查詢篩選出事件並插入一個「報警」到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分鐘,然後得到一個很好的事件,是有可能寫出一個查詢,使得一個新的窗口從下一個不良事件開始?

  2. 是否可以選擇窗口中最後一個事件的數據?我嘗試使用LAST()和LAG(),但它給了我一個編譯錯誤,說「不能使用GROUP BY沒有聚合函數」。問題是我不需要一個聚合函數只是最後一個事件值。

我一直堅持這個問題幾天,任何幫助將不勝感激。

此外,這是我的第一個問題,所以請原諒我的noobishness

回答

0

您可以用滑動窗口實現這一點。 滑動窗口在每個事件上產生輸出並回顧所提供的持續時間。在您的示例中,只有當讀數低於閾值1小時時才需要輸出。像下面的查詢應該工作。

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