Azure Stream Analytics JavaScript kullanıcı tanımlı kümeleme fonksiyonları

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 kaldırma 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 Tumbling, Hopping, Sliding ve Oturum Penceresi için 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 topluluklar yalnızca yeni olayları kendi durumuna biriktirebilir, algoritma değerlerin birikimini azaltmaya izin vermez. Bir olay bilgisinin durum değerinden çözümlenmesi imkansız olduğunda bu toplama türünü seçin. AccumulateOnly toplamaları için JavaScript şablonu aşağıdadı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 işlevi toplamları birleştirir ve ayırır

AccumulateDeaccumulate gruplama işlemi, bir önceki birikmiş değerin genel durumdan çıkarılmasına olanak tanır; örneğin, olay değerleri listesinden bir anahtar-değer çiftini kaldırabilir veya bir toplama işlemi durumundan bir değeri çıkarabilirsiniz. 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.

Fonksiyon takma adı

Fonksiyon takma adı, UDA tanımlayıcısıdır. Stream Analytics sorgusunda çağrıldığında, "uda." ön eki ile birlikte daima UDA takma adını 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 takma 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.

Yöntem – 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, Stream Analytics ve JavaScript türü dönüştürme bölümüne bakmak üzere JavaScript UDF'lerini Tümleştirme belgesine başvurun.

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, 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