2017-07-25 20 views
0

我正在流式傳輸包含posix/epoch時間字段的事件消息。我正在計算在哪個時間範圍內,我收到了來自設備的一系列消息。獲取流分析中接收到一系列消息的時間幀

讓我們假設以下的(簡化的)輸入:

[ 
    { "deviceid":"device01", "epochtime":1500975613660 }, 
    { "deviceid":"device01", "epochtime":1500975640194 }, 
    { "deviceid":"device01", "epochtime":1500975649627 }, 
    { "deviceid":"device01", "epochtime":1500994473225 }, 
    { "deviceid":"device01", "epochtime":1500994486725 } 
] 

我的計算的結果應該是這樣{設備ID,開始,結束}對於每個設備ID的消息。如果兩個事件之間的時間間隔超過一個小時,我假設新的時間框架開始。在我的例子,這將導致兩個傳輸:

[ 
{"deviceid":"device01", "start":1500975613660, "end"=1500975649627}, 
{"deviceid":"device01", "start":500994473225, "end"=1500994486725} 
] 

我可以根據實施例2的文檔https://msdn.microsoft.com/en-us/library/azure/mt573293.aspx在轉換時期的時間。但是,我不能在子查詢中使用LAG函數的轉換時間戳。 previousTime的所有值在輸出中都爲空。

WITH step1 AS (
SELECT 
    [deviceid] AS deviceId, 
    System.Timestamp AS ts, 
    LAG([ts]) OVER (LIMIT DURATION(hour, 24)) as previousTime 
FROM 
    input TIMESTAMP BY DATEADD(millisecond, epochtime, '1970-01-01T00:00:00Z') 
) 

我不知道如何執行我的計算,最好的方法是什麼。我需要弄清楚事件系列的開始和結束。

任何幫助,非常感謝。

回答

1

我微微,以獲得預期的結果如下修改您的查詢:

WITH STEP1 AS (
    SELECT 
    [deviceid] AS deviceId, 
    System.Timestamp AS ts, 
    LAG(DATEADD(millisecond, epochtime, '1970-01-01T00:00:00Z')) OVER (LIMIT DURATION(hour, 24)) as previousTime 
    FROM 
    input TIMESTAMP BY DATEADD(millisecond, epochtime, '1970-01-01T00:00:00Z') 
) 
SELECT * from STEP1 

的問題是「TS」在當前步驟定義,但使用LAG,當你正在尋找原始消息來FROM語句,它不包含「ts」變量。

讓我知道你是否有任何問題。

感謝,

JS - Azure的數據流分析團隊

+1

非常感謝你。我認爲我也可以在查詢本身中引用這個字段。 –