Agregat yang ditentukan pengguna JavaScript Azure Stream Analytics

Azure Stream Analytics mendukung agregat yang ditentukan pengguna (UDA) yang ditulis dalam JavaScript, memungkinkan Anda menerapkan logika bisnis yang rumit. Dalam UDA Anda memiliki kendali penuh atas struktur data status, akumulasi status, deakumulasi status, dan komputasi hasil agregat. Artikel ini memperkenalkan dua antarmuka UDA JavaScript yang berbeda, langkah-langkah untuk membuat UDA, dan cara menggunakan UDA dengan operasi berbasis jendela dalam kueri Azure Stream Analytics.

Agregat yang ditentukan pengguna JavaScript

Agregat yang ditentukan pengguna digunakan di atas spesifikasi jendela waktu untuk mengagregasi peristiwa di jendela tersebut dan menghasilkan satu nilai hasil. Ada dua jenis antarmuka UDA yang didukung Azure Stream Analytics saat ini, AccumulateOnly dan AccumulateDeaccumulate. Kedua jenis UDA dapat digunakan oleh Jendela Jatuh, Lompat, Meluncur dan Sesi. UDA AccumulateDeaccumulate berkinerja lebih baik daripada UDA AccumulateOnly saat digunakan bersama dengan Jendela Hopping, Sliding, dan Sesi. Anda memilih salah satu dari dua jenis berdasarkan algoritma yang Anda gunakan.

Agregat AccumulateOnly

Agregat AccumulateOnly hanya dapat mengakumulasi peristiwa baru ke statusnya, algoritma tidak memungkinkan deakumulasi nilai. Pilih jenis agregat ini ketika deakumulasi informasi peristiwa dari nilai status, tidak mungkin diterapkan. Berikut ini adalah templat JavaScript untuk agregat AccumulatOnly:

// 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;
    }
}

Agregat AccumulateDeaccumulate

Agregat AccumulateDeaccumulate memungkinkan deakumulasi nilai akumulasi sebelumnya dari status, misalnya, menghapus pasangan nilai kunci dari daftar nilai peristiwa, atau mengurangi nilai dari status agregat jumlah. Berikut ini adalah templat JavaScript untuk agregat AccumulateDeaccumulate:

// 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 - Deklarasi fungsi JavaScript

Setiap UDA JavaScript didefinisikan oleh deklarasi objek Fungsi. Berikut adalah elemen utama dalam definisi UDA.

Alias fungsi

Alias Fungsi adalah pengidentifikasi UDA. Saat dipanggil dalam kueri Azure Stream Analytics, selalu gunakan alias UDA bersama dengan prefiks "uda."

Jenis Fungsi

Untuk UDA, jenis fungsi harus UDA JavaScript.

Jenis output

Jenis tertentu yang didukung oleh pekerjaan Azure Stream Analytics, atau "Apa pun" jika Anda ingin menghandel jenis dalam kueri Anda.

Nama fungsi

Nama objek Fungsi ini. Nama fungsi harus cocok dengan alias UDA.

Metode - init()

Metode init() menginisialisasi status agregat. Metode ini dipanggil ketika jendela dimulai.

Metode – accumulate()

Metode accumulate() menghitung status UDA berdasarkan status sebelumnya dan nilai peristiwa saat ini. Metode ini dipanggil ketika suatu peristiwa memasuki jendela waktu (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW atau SESSIONWINDOW).

Metode – deaccumulate()

Metode deaccumulate() menghitung ulang status berdasarkan status sebelumnya dan nilai peristiwa saat ini. Metode ini disebut ketika suatu peristiwa meninggalkan SLIDINGWINDOW atau SESSIONWINDOW.

Metode – deaccumulateState()

Metode deaccumulateState() menghitung ulang status berdasarkan kondisi sebelumnya dan kondisi lompat. Metode ini dipanggil ketika set peristiwa meninggalkan HOPPINGWINDOW.

Metode – computeResult()

Metode computeResult() memberikan hasil agregat berdasarkan status saat ini. Metode ini dipanggil pada akhir jendela waktu (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW atau SESSIONWINDOW).

Jenis data input dan output yang didukung UDA JavaScript

Untuk jenis data UDA JavaScript, lihat bagian Azure Stream Analytics dan konversi jenis JavaScript dari Mengintegrasikan UDF JavaScript.

Menambahkan UDA JavaScript dari portal Microsoft Azure

Di bawah ini kita berjalan melalui proses pembuatan UDA dari Portal. Contoh yang kami gunakan di sini adalah komputasi rata-rata waktu tertimbang.

Sekarang mari kita membuat UDA JavaScript di bawah pekerjaan ASA yang ada dengan langkah-langkah berikut.

  1. Masuk ke portal Microsoft Azure dan temukan pekerjaan Azure Stream Analytics Anda yang sudah ada.

  2. Kemudian klik link fungsi di bagian TOPOLOGI PEKERJAAN.

  3. Pilih Tambahkan untuk menambahkan fungsi baru.

  4. Pada tampilan Fungsi Baru, pilih UDA JavaScript sebagai Jenis Fungsi, lalu Anda akan melihat templat UDA default muncul di editor.

  5. Isi "TWA" sebagai alias UDA dan ubah implementasi fungsi sebagai berikut:

    // 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. Setelah Anda mengklik tombol "Simpan", UDA Anda akan muncul di daftar fungsi.

  7. Pilih fungsi baru "TWA", Anda dapat memeriksa definisi fungsi.

Memanggil UDA JavaScript dalam kueri ASA

Di portal Microsoft Azure dan buka pekerjaan Anda, edit kueri dan panggil fungsi TWA() dengan awalan mandat "uda.". Misalnya:

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)

Kueri pengujian dengan UDA

Buat file JSON lokal dengan konten di bawah ini, unggah file ke pekerjaan Azure Stream Analytics, dan uji kueri di atas.

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

Dapatkan bantuan

Untuk bantuan lebih lanjut, coba halaman pertanyaan Tanya Jawab Microsoft untuk Azure Stream Analytics.

Langkah berikutnya