Agregat yang didefinisikan pengguna JavaScript pada 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 kontrol penuh atas struktur data status, akumulasi status, deakkumulasi 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 Tumbling Window, Hopping Window, Sliding Window, dan Session Window. AccumulateDeaccumulate UDA berkinerja lebih baik daripada AccumulateOnly UDA saat digunakan bersama dengan Jendela Hopping, Jendela Sliding, dan Jendela Sesi. Anda memilih salah satu dari dua jenis berdasarkan algoritma yang Anda gunakan.

"Hanya Akumulasi mengagregasi."

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

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

Fungsi AccumulateDeaccumulate

Agregat AccumulateDeaccumulate memungkinkan deakumulasi nilai akumulasi sebelumnya dari keadaan, misalnya, menghapus pasangan kunci-nilai dari daftar nilai peristiwa, atau melakukan pengurangan nilai dari keadaan 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

Pengidentifikasi UDA adalah alias fungsi. 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 Stream Analytics, atau "Apa pun" jika Anda ingin menangani 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 – akumulasi()

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 – deakumulasi()

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

Metode – deaccumulateState()

Metode deaccumulateState() menghitung ulang keadaan berdasarkan keadaan sebelumnya dan keadaan lompatan. Metode ini dipanggil ketika sekumpulan peristiwa keluar dari 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 tipe data UDA dalam JavaScript, lihat bagian Azure Stream Analytics dan konversi tipe 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 menggunakan 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 Azure, buka pekerjaan Anda dan edit kueri serta panggil fungsi TWA() dengan awalan mandat "uda.". Contohnya:

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)

Pengujian kueri 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