Azure Stream Analytics JavaScript kullanıcı tanımlı toplamalar

Azure Stream Analytics, JavaScript ile yazılmış kullanıcı tanımlı toplamaları (UDA) destekler ve karmaşık durum bilgisi olan iş mantığı uygulamanızı sağlar. UDA'da durum veri yapısı, durum birikimi, durum azaltma ve toplam sonuç hesaplaması üzerinde tam denetime sahipsiniz. Makalede iki farklı JavaScript UDA arabirimi, UDA oluşturma adımları ve Stream Analytics sorgusunda pencere tabanlı işlemlerle UDA'nın nasıl kullanılacağı açıklanır.

JavaScript kullanıcı tanımlı toplamalar

Kullanıcı tanımlı toplama, bir zaman penceresi belirtiminin üzerinde, bu penceredeki olaylar üzerinde toplama yapmak ve tek bir sonuç değeri üretmek için kullanılır. Stream Analytics'in bugün desteklediği iki tür UDA arabirimi vardır: AccumulateOnly ve AccumulateDeaccumulate. Her iki UDA türü de Atlayan, Atlamalı, Kayan ve Oturum Penceresi tarafından kullanılabilir. AccumulateDeaccumulate UDA, Atlama, Kaydırma ve Oturum Penceresi ile birlikte kullanıldığında AccumulateOnly UDA'dan daha iyi performans gösterir. Kullandığınız algoritmaya göre iki türden birini seçersiniz.

AccumulateOnly toplamları

AccumulateOnly toplamları yalnızca yeni olayları kendi durumunda birikebilir, algoritma değerlerin toplanmasına izin vermez. Durum değerinden bir olay bilgisinin uygulanması imkansız olduğunda bu toplama türünü seçin. Aşağıda AccumulatOnly toplamaları için JavaScript şablonu yer alır:

// 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 toplamaları

AccumulateDeaccumulate toplamaları, bir önceki birikmiş değerin durumundan kaldırılmasına olanak sağlar; örneğin, olay değerleri listesinden bir anahtar-değer çiftini kaldırın veya bir değeri toplama durumundan çıkarın. AccumulateDeaccumulate toplamları için JavaScript şablonu aşağıdadır:

// 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 işlev bildirimi

Her JavaScript UDA, bir İşlev nesnesi bildirimi tarafından tanımlanır. UDA tanımındaki başlıca öğeler aşağıdadır.

İşlev diğer adı

İşlev diğer adı UDA tanımlayıcısıdır. Stream Analytics sorgusunda çağrıldığında her zaman UDA diğer adını bir "uda" ön eki ile birlikte kullanın.

İşlev türü

UDA için işlev türü JavaScript UDA olmalıdır.

Çıkış türü

Stream Analytics işinin desteklediği belirli bir tür veya sorgunuzdaki türü işlemek istiyorsanız "Herhangi biri".

İşlev adı

Bu İşlev nesnesinin adı. İşlev adı UDA diğer adıyla eşleşmelidir.

Method - init()

init() yöntemi toplama durumunu başlatır. Pencere başlatıldığında bu yöntem çağrılır.

Yöntem – accumulate()

accumulate() yöntemi, UDA durumunu önceki duruma ve geçerli olay değerlerine göre hesaplar. Bir olay bir zaman penceresine (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW veya SESSIONWINDOW) girdiğinde bu yöntem çağrılır.

Method – deaccumulate()

deaccumulate() yöntemi, önceki duruma ve geçerli olay değerlerine göre durumu yeniden hesaplar. Bir olay SLIDINGWINDOW veya SESSIONWINDOW'dan ayrıldığında bu yöntem çağrılır.

Method – deaccumulateState()

deaccumulateState() yöntemi, önceki duruma ve atlamanın durumuna göre durumu yeniden hesaplar. Bu yöntem, bir dizi olay BIR HOPPINGWINDOW'dan ayrıldığında çağrılır.

Method – computeResult()

computeResult() yöntemi, geçerli duruma göre toplam sonuç döndürür. Bu yöntem bir zaman penceresinin sonunda çağrılır (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW veya SESSIONWINDOW).

JavaScript UDA tarafından desteklenen giriş ve çıkış veri türleri

JavaScript UDA veri türleri için Tümleştirme JavaScript UDF'lerinin Stream Analytics ve JavaScript türü dönüştürmesi bölümüne bakın.

Azure portalından JavaScript UDA ekleme

Aşağıda Portaldan UDA oluşturma işleminde adım adım ilerleyeceğiz. Burada kullandığımız örnek, zaman ağırlıklı ortalamaları hesaplamadır.

Şimdi aşağıdaki adımları izleyerek mevcut ASA işinin altında bir JavaScript UDA oluşturalım.

  1. Azure portalında oturum açın ve mevcut Stream Analytics işinizi bulun.

  2. Ardından İş TOPOLOJİSİ altında işlevler bağlantısını seçin.

  3. Yeni işlev eklemek için Ekle'yi seçin.

  4. Yeni İşlev görünümünde İşlev Türü olarak JavaScript UDA'yı seçin, ardından düzenleyicide varsayılan bir UDA şablonunun gösterildiğini görürsünüz.

  5. UDA diğer adı olarak "TWA" yazın ve işlev uygulamasını aşağıdaki gibi değiştirin:

    // 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. "Kaydet" düğmesini seçtiğinizde UDA'nız işlev listesinde görünür.

  7. Yeni "TWA" işlevini seçin, işlev tanımını kontrol edebilirsiniz.

ASA sorgusunda JavaScript UDA çağırma

Azure portalında işinizi açın ve sorguyu düzenleyin ve "uda" manda ön eki ile TWA() işlevini çağırın. Örneğin:

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)

Sorguyu UDA ile test etme

Aşağıdaki içeriğe sahip yerel bir JSON dosyası oluşturun, dosyayı Stream Analytics işine yükleyin ve yukarıdaki sorguyu test edin.

[
  {"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}
]

Yardım alın

Ek yardım için Azure Stream Analytics için Microsoft Soru-Cevap soru sayfamızı deneyin.

Sonraki adımlar