Azure 串流分析 JavaScript 使用者定義彙總

「Azure 串流分析」支援以 JavaScript 撰寫的使用者定義彙總 (UDA),可讓您實作複雜的具狀態商務邏輯。 在 UDA 內,您可以完全控制狀態資料結構、狀態累積、狀態取消累積,以及彙總結果計算。 本文將介紹兩種不同的 JavaScript UDA 介面、建立 UDA 的步驟,以及如何在「串流分析」中搭配 Windows 型作業使用 UDA。

JavaScript 使用者定義彙總

使用者定義彙總是在指定的時間範圍上用來彙總該範圍中的事件,然後產生單一的結果值。 目前「串流分析」支援兩種類型的 UDA 介面:AccumulateOnly 和 AccumulateDeaccumulate。 這兩種類型的 UDA 都可供「輪轉時間範圍」、「跳動時間範圍」、「滑動時間範圍」及「工作階段時間範圍」使用。 與「跳動時間範圍」、「滑動時間範圍」及「工作階段時間範圍」搭配使用時,AccumulateDeaccumulate UDA 的執行效能會比 AccumulateOnly UDA 好。 您需根據所使用的演算法來選擇這兩種類型其中之一。

AccumulateOnly 彙總

AccumulateOnly 彙總只會將新事件累積至其狀態,此演算法不會允許將值取消累積。 無法進行將事件資訊從狀態值取消累積的實作時,請選擇此彙總類型。 以下是 AccumulatOnly 彙總的 JavaScript 範本:

// Sample UDA which state can only be accumulated.
function main() {
    this.init = function () {
        this.state = 0;
    }

    this.accumulate = function (value, timestamp) {
        this.state += value;
    }

    this.computeResult = function () {
        return this.state;
    }
}

AccumulateDeaccumulate 彙總

AccumulateDeaccumulate 彙總可允許將先前累積的值從狀態中取消累積,例如從事件值清單中移除機碼值組,或從總和彙總的狀態中減去某個值。 以下是 AccumulateDeaccumulate 彙總的 JavaScript 範本:

// Sample UDA which state can be accumulated and deaccumulated.
function main() {
    this.init = function () {
        this.state = 0;
    }

    this.accumulate = function (value, timestamp) {
        this.state += value;
    }

    this.deaccumulate = function (value, timestamp) {
        this.state -= value;
    }

    this.deaccumulateState = function (otherState){
        this.state -= otherState.state;
    }

    this.computeResult = function () {
        return this.state;
    }
}

UDA - JavaScript 函式宣告

每個 JavaScript UDA 都由一個「函式」物件宣告來定義。 以下是 UDA 定義中的主要元素。

函式別名

函式別名是 UDA 識別碼。 在「串流分析」查詢中呼叫時,請一律將 UDA 別名與 "uda" 前置詞搭配使用。

函式類型

就 UDA 而言,函式類型應該是 Javascript UDA

輸出類型

「串流分析」作業支援的特定類型,或如果您想要在查詢中處理類型,則為 "Any"。

函式名稱

此「函式」物件的名稱。 函式名稱應符合 UDA 別名。

方法 - init()

init() 方法會將彙總狀態初始化。 呼叫此方法的時機是在時間範圍開始時。

方法 – accumulate()

accumulate() 方法會根據先前的狀態和目前的事件值來計算 UDA 狀態。 呼叫此方法的時機是在事件進入某個時間範圍 (TUMBLINGWINDOW、HOPPINGWINDOW、SLIDINGWINDOW 或 SESSIONWINDOW) 時。

方法 – deaccumulate()

deaccumulate() 方法會根據先前的狀態和目前的事件值來重新計算狀態。 呼叫此方法的時機是在事件離開 SLIDINGWINDOW 或 SESSIONWINDOW 時。

方法 – deaccumulateState()

deaccumulateState() 方法會根據先前的狀態和躍點的狀態來重新計算狀態。 呼叫此方法的時機是在一組事件離開 HOPPINGWINDOW 時。

方法 – computeResult()

computeResult() 方法會根據目前的狀態傳回彙總結果。 呼叫此方法的時機是在時間範圍 (TUMBLINGWINDOW、HOPPINGWINDOW、SLIDINGWINDOW 或 SESSIONWINDOW) 結束時。

JavaScript UDA 支援的輸入和輸出資料類型

針對 JavaScript UDA 資料類型,請參閱整合 JavaScript UDF串流分析與 JavaScript 類型轉換一節。

從 Azure 入口網站新增 JavaScript UDA

以下我們將會逐步完成從「入口網站」建立 UDA 的程序。 我們在這裡使用的範例是計算時間加權平均值。

現在,我們將依循步驟,在現有的 ASA 作業底下建立一個 JavaScript UDA。

  1. 登入 Azure 入口網站並找出您現有的「串流分析」作業。

  2. 然後選取 [作業拓撲] 下方的函式連結。

  3. 選取 [新增] 以新增函式。

  4. 在 [新增函式] 檢視上,選取 [JavaScript UDA] 作為 [函式類型],然後您就會在編輯器中看見預設的 UDA 範本。

  5. 填入 "TWA" 作為 UDA 別名,然後依下列方式變更函式實作:

    // Sample UDA which calculate Time-Weighted Average of incoming values.
    function main() {
        this.init = function () {
            this.totalValue = 0.0;
            this.totalWeight = 0.0;
        }
    
        this.accumulate = function (value, timestamp) {
            this.totalValue += value.level * value.weight;
            this.totalWeight += value.weight;
    
        }
    
        // Uncomment below for AccumulateDeaccumulate implementation
        /*
        this.deaccumulate = function (value, timestamp) {
            this.totalValue -= value.level * value.weight;
            this.totalWeight -= value.weight;
        }
    
        this.deaccumulateState = function (otherState){
            this.state -= otherState.state;
            this.totalValue -= otherState.totalValue;
            this.totalWeight -= otherState.totalWeight;
        }
        */
    
        this.computeResult = function () {
            if(this.totalValue == 0) {
                result = 0;
            }
            else {
                result = this.totalValue/this.totalWeight;
            }
            return result;
        }
    }
    
  6. 選取 [儲存] 按鈕之後,您的 UDA 就會顯示在函式清單上。

  7. 選取新函式 "TWA" 即可查看函式定義。

在 ASA 查詢中呼叫 JavaScript UDA

在 Azure 入口網站中,開啟您的作業、編輯查詢,然後使用授權前置詞 "uda" 來呼叫 TWA() 函式。 例如:

WITH value AS
(
    SELECT
    NoiseLevelDB as level,
    DurationSecond as weight
FROM
    [YourInputAlias] TIMESTAMP BY EntryTime
)
SELECT
    System.Timestamp as ts,
    uda.TWA(value) as NoseDoseTWA
FROM value
GROUP BY TumblingWindow(minute, 5)

使用 UDA 來測試查詢

使用下列內容來建立一個本機 JSON 檔案,將此檔案上傳到「串流分析」作業中,然後測試上述查詢。

[
  {"EntryTime": "2017-06-10T05:01:00-07:00", "NoiseLevelDB": 80, "DurationSecond": 22.0},
  {"EntryTime": "2017-06-10T05:02:00-07:00", "NoiseLevelDB": 81, "DurationSecond": 37.8},
  {"EntryTime": "2017-06-10T05:02:00-07:00", "NoiseLevelDB": 85, "DurationSecond": 26.3},
  {"EntryTime": "2017-06-10T05:03:00-07:00", "NoiseLevelDB": 95, "DurationSecond": 13.7},
  {"EntryTime": "2017-06-10T05:03:00-07:00", "NoiseLevelDB": 88, "DurationSecond": 10.3},
  {"EntryTime": "2017-06-10T05:05:00-07:00", "NoiseLevelDB": 103, "DurationSecond": 5.5},
  {"EntryTime": "2017-06-10T05:06:00-07:00", "NoiseLevelDB": 99, "DurationSecond": 23.0},
  {"EntryTime": "2017-06-10T05:07:00-07:00", "NoiseLevelDB": 108, "DurationSecond": 1.76},
  {"EntryTime": "2017-06-10T05:07:00-07:00", "NoiseLevelDB": 79, "DurationSecond": 17.9},
  {"EntryTime": "2017-06-10T05:08:00-07:00", "NoiseLevelDB": 83, "DurationSecond": 27.1},
  {"EntryTime": "2017-06-10T05:09:00-07:00", "NoiseLevelDB": 91, "DurationSecond": 17.1},
  {"EntryTime": "2017-06-10T05:09:00-07:00", "NoiseLevelDB": 115, "DurationSecond": 7.9},
  {"EntryTime": "2017-06-10T05:09:00-07:00", "NoiseLevelDB": 80, "DurationSecond": 28.3},
  {"EntryTime": "2017-06-10T05:10:00-07:00", "NoiseLevelDB": 55, "DurationSecond": 18.2},
  {"EntryTime": "2017-06-10T05:10:00-07:00", "NoiseLevelDB": 93, "DurationSecond": 25.8},
  {"EntryTime": "2017-06-10T05:11:00-07:00", "NoiseLevelDB": 83, "DurationSecond": 11.4},
  {"EntryTime": "2017-06-10T05:12:00-07:00", "NoiseLevelDB": 89, "DurationSecond": 7.9},
  {"EntryTime": "2017-06-10T05:15:00-07:00", "NoiseLevelDB": 112, "DurationSecond": 3.7},
  {"EntryTime": "2017-06-10T05:15:00-07:00", "NoiseLevelDB": 93, "DurationSecond": 9.7},
  {"EntryTime": "2017-06-10T05:18:00-07:00", "NoiseLevelDB": 96, "DurationSecond": 3.7},
  {"EntryTime": "2017-06-10T05:20:00-07:00", "NoiseLevelDB": 108, "DurationSecond": 0.99},
  {"EntryTime": "2017-06-10T05:20:00-07:00", "NoiseLevelDB": 113, "DurationSecond": 25.1},
  {"EntryTime": "2017-06-10T05:22:00-07:00", "NoiseLevelDB": 110, "DurationSecond": 5.3}
]

取得協助

如需其他協助,請嘗試 Azure 串流分析的 Microsoft 問與答頁面

下一步