Fungsi yang ditentukan pengguna JavaScript di Azure Stream Analytics

Azure Stream Analytics mendukung fungsi yang ditentukan pengguna yang ditulis dalam JavaScript. Dengan set metode Untai (karakter) , RegExp, Matematika, Array, dan Tanggal yang kaya yang disediakan JavaScript, transformasi data yang kompleks dengan pekerjaan Azure Stream Analytics menjadi lebih mudah dibuat.

Gambaran Umum

Fungsi yang ditentukan pengguna JavaScript mendukung fungsi bernilai skalar tanpa status, komputasi-saja yang tidak memerlukan konektivitas eksternal. Nilai kembali fungsi hanya dapat menjadi nilai skalar (tunggal). Setelah Anda menambahkan fungsi yang ditentukan pengguna JavaScript ke pekerjaan, Anda bisa menggunakan fungsi di mana saja dalam kueri, seperti fungsi bernilai skalar bawaan.

Berikut adalah beberapa skenario di mana fungsi yang ditentukan pengguna JavaScript berguna bagi Anda:

  • Mengurai dan memanipulasi untai (karakter) yang memiliki fungsi regex, misalnya, Regexp_Replace() dan Regexp_Extract()
  • Mendekodekan dan mengodekan data, misalnya, konversi biner-ke-hex
  • Melakukan komputasi matematika dengan fungsi Matematika JavaScript
  • Melakukan operasi array seperti mengurutkan, menggabungkan, menemukan, dan mengisi

Berikut adalah beberapa hal yang tidak dapat Anda lakukan dengan fungsi yang ditentukan pengguna JavaScript di Azure Stream Analytics:

  • Memanggil titik akhir REST eksternal, misalnya, melakukan pencarian IP terbalik atau menarik data referensi dari sumber eksternal
  • Melakukan serialisasi format kejadian kustom atau deserialisasi pada input/output
  • Membuat agregat kustom

Meskipun fungsi seperti Date.GetDate() atau Math.random() tidak diblokir dalam definisi fungsi, Anda harus menghindari penggunaannya. Fungsi-fungsi ini tidak mengembalikan hasil yang sama setiap kali Anda memanggilnya, dan layanan Azure Stream Analytics tidak menyimpan jurnal invokasi fungsi dan hasil yang dikembalikan. Jika fungsi mengembalikan hasil yang berbeda pada kejadian yang sama, pengulangan tidak dijamin saat pekerjaan dimulai ulang oleh Anda atau oleh layanan Azure Stream Analytics.

Menambahkan fungsi yang ditentukan pengguna JavaScript ke pekerjaan Anda

Catatan

Langkah-langkah ini berfungsi pada pekerjaan Azure Stream Analytics yang dikonfigurasi untuk dijalankan di cloud. Jika pekerjaan Azure Stream Analytics Anda dikonfigurasi untuk berjalan di Azure IoT Edge, gunakan Visual Studio dan tulis fungsi yang ditentukan pengguna menggunakan C#.

Untuk membuat fungsi yang ditentukan pengguna JavaScript di pekerjaan Azure Stream Analytics Anda, pilih Azure Functions di bawah Topologi Pekerjaan. Kemudian, pilih UDF JavaScript dari menu menurun +Tambahkan.

Menambahkan UDF JavaScript

Anda kemudian harus menyediakan properti berikut dan pilih Simpan.

Properti Deskripsi
Alias fungsi Masukkan nama untuk memanggil fungsi di kueri Anda.
Jenis output Ketik yang akan dikembalikan oleh fungsi yang ditentukan pengguna JavaScript ke kueri Azure Stream Analytics Anda.
Definisi fungsi Penerapan fungsi JavaScript Anda yang akan dijalankan setiap kali UDF dipanggil dari kueri.

Menguji dan memecahkan masalah UDF JavaScript

Anda dapat menguji dan mendebug logika UDF JavaScript di browser apa pun. Penelusuran kesalahan dan pengujian logika fungsi yang ditentukan pengguna ini, saat ini tidak didukung di portal Azure Stream Analytics. Setelah fungsi bekerja seperti yang diharapkan, Anda dapat menambahkannya ke pekerjaan Azure Stream Analytics seperti yang disebutkan di atas lalu memanggilnya langsung dari kueri. Anda dapat menguji logika kueri dengan UDF JavaScript menggunakan alat Azure Stream Analytics untuk Visual Studio.

Kesalahan runtime bahasa umum JavaScript dianggap fatal, dan muncul melalui log Aktivitas. Untuk mengambil log, di portal Azure, buka pekerjaan Anda dan pilih Log aktivitas.

Memanggil fungsi yang ditentukan pengguna JavaScript dalam kueri

Anda dapat dengan mudah memanggil fungsi JavaScript Anda di kueri menggunakan alias fungsi yang diawali dengan udf. Berikut adalah contoh UDF JavaScript yang mengonversi nilai heksadesimal menjadi bilangan bulat yang dipanggil dalam kueri Azure Stream Analytics.

    SELECT
        time,
        UDF.hex2Int(offset) AS IntOffset
    INTO
        output
    FROM
        InputStream

Objek JavaScript yang didukung

Fungsi yang ditentukan pengguna JavaScript Azure Stream Analytics mendukung objek JavaScript bawaan standar. Untuk daftar objek ini, lihat Objek Global.

Konversi jenis Azure Stream Analytics dan JavaScript

Ada perbedaan dalam jenis yang didukung oleh bahasa pemrogram kueri Azure Stream Analytics dan JavaScript. Tabel ini mencantumkan pemetaan konversi di antara keduanya:

Stream Analytics JavaScript
bigint Angka (JavaScript hanya dapat mewakili bilangan bulat hingga tepatnya 2^53)
TanggalWaktu Tanggal (JavaScript hanya mendukung milidetik)
ganda Telepon
nvarchar(MAX) Untai (karakter)
Rekaman Object
Array Array
NULL Null

Berikut adalah konversi JavaScript-ke-Azure Stream Analytics:

JavaScript Stream Analytics
Telepon Bigint (jika angkanya bulat dan antara long.MinValue and long.MaxValue; jika tidak, nomor adalah ganda)
Tanggal DateTime
Untai (karakter) nvarchar(MAX)
Object Rekaman
Array Array
Null, Tidak Terdefinisi NULL
Jenis lain (misalnya, fungsi atau kesalahan) Tidak didukung (mengakibatkan kesalahan runtime bahasa umum)

Bahasa pemrogram JavaScript peka huruf besar/kecil dan kapitalisasi bidang objek dalam kode JavaScript harus cocok dengan kapitalisasi bidang dalam data masuk. Pekerjaan dengan tingkat kompatibilitas 1.0 akan mengonversi bidang dari pernyataan SQL SELECT menjadi huruf kecil. Di bawah tingkat kompatibilitas 1.1 dan yang lebih tinggi, bidang dari pernyataan SELECT akan memiliki kapitalisasi yang sama seperti yang ditentukan dalam kueri SQL.

Pola fungsi yang ditentukan pengguna JavaScript lainnya

Tulis JSON berlapis ke output

Jika Anda memiliki langkah pemrosesan tindak lanjut yang menggunakan output pekerjaan Azure Stream Analytics sebagai input, dan memerlukan format JSON, Anda dapat menulis untai (karakter) JSON ke output. Contoh berikutnya memanggil fungsi JSON.stringify() untuk mengemas semua pasangan nama/nilai input, lalu menuliskannya sebagai nilai untai (karakter) tunggal dalam output.

Definisi fungsi yang ditentukan pengguna JavaScript:

function main(x) {
return JSON.stringify(x);
}

Kueri sampel:

SELECT
    DataString,
    DataValue,
    HexValue,
    UDF.jsonstringify(input) As InputEvent
INTO
    output
FROM
    input PARTITION BY PARTITIONID

Transmisikan untai (karakter) ke objek JSON untuk diproses

Jika Anda memiliki bidang untai (karakter) JSON dan ingin mengonversinya menjadi objek JSON untuk diproses di UDF JavaScript, Anda dapat menggunakan fungsi JSON.parse() untuk membuat objek JSON yang kemudian dapat digunakan.

Definisi fungsi yang ditentukan pengguna JavaScript:

function main(x) {
var person = JSON.parse(x);  
return person.name;
}

Kueri sampel:

SELECT
    UDF.getName(input) AS Name
INTO
    output
FROM
    input

Gunakan coba/tangkap untuk penanganan kesalahan

Blok coba/tangkap dapat membantu Anda mengidentifikasi masalah dengan data input yang salah yang diteruskan ke UDF JavaScript.

Definisi fungsi yang ditentukan pengguna JavaScript:

function main(input, x) {
    var obj = null;

    try{
        obj = JSON.parse(x);
    }catch(error){
        throw input;
    }
    
    return obj.Value;
}

Kueri sampel: Berikan seluruh rekaman sebagai parameter pertama sehingga dapat dikembalikan jika ada kesalahan.

SELECT
    A.context.company AS Company,
    udf.getValue(A, A.context.value) as Value
INTO
    output
FROM
    input A

toLocaleString()

Metode toLocaleString di JavaScript dapat digunakan untuk mengembalikan untai (karakter) sensitif bahasa yang mewakili data waktu tanggal dari mana metode ini dipanggil. Meskipun Azure Stream Analtyics hanya menerima waktu tanggal UTC sebagai tanda waktu sistem, metode ini dapat digunakan untuk menutupi tanda waktu sistem ke lokal dan zona waktu lain. Metode ini mengikuti perilaku penerapan yang sama dengan yang tersedia di Internet Explorer .

Definisi fungsi yang ditentukan pengguna JavaScript:

function main(datetime){
    const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
    return datetime.toLocaleDateString('de-DE', options);
}

Kueri sampel: Melewati tanggalwaktu sebagai nilai input

SELECT
    udf.toLocaleString(input.datetime) as localeString
INTO
    output
FROM
    input

Output kueri ini akan menjadi tanggalwaktu input di de-DE dengan opsi yang disediakan.

Samstag, 28. Dezember 2019

Pengelogan Pengguna

Mekanisme pengelogan memungkinkan pengguna untuk mengambil informasi kustom saat pekerjaan sedang berjalan. Data log dapat digunakan untuk men-debug atau menilai kebenaran kode kustom secara real time. Mekanisme ini tersedia melalui tiga metode yang berbeda.

Console.Info()

metode Console.Info digunakan untuk mencatat informasi umum selama eksekusi kode. Metode ini akan mencatat data tanpa mengganggu komputasi. Pesan yang dicatat akan ditandai sebagai Informasi Tingkat Peristiwa.

console.info('my info message');

Console.Warn()

Metode Console.Warn digunakan untuk mencatat data yang mungkin tidak benar atau diharapkan tetapi masih diterima untuk komputasi. Metode ini tidak akan mengganggu komputasi dan akan terus berjalan setelah metode dikembalikan. Pesan yang dicatat akan ditandai sebagai Peringatan Tingkat Peristiwa.

console.warn('my warning message');

Console.Error() dan Console.Log()

Metode Console.Error hanya digunakan untuk mencatat kasus kesalahan di mana kode tidak dapat terus berjalan. Metode ini akan memberikan pengecualian dengan informasi kesalahan yang diberikan karena parameter input dan pekerjaan akan berhenti berjalan. Pesan kesalahan yang dicatat akan ditandai sebagai Kesalahan Tingkat Peristiwa.

console.error('my error message');

Anda dapat mengakses pesan log melalui log diagnostik.

atob() dan btoa()

Metode btoa() dapat digunakan untuk mengodekan string ASCII ke Base64. Ini biasanya dilakukan untuk mentransfer data dalam format biner. Metode atob() dapat digunakan untuk mendekode string data yang dikodekan dalam Base64 ke format string ASCII.

var myAsciiString = 'ascii string';
var encodedString = btoa(myAsciiString);
var decodedString = atob(encodedString);

Langkah berikutnya