Azure Stream Analytics'te JavaScript kullanıcı tanımlı işlevleri

Azure Stream Analytics, JavaScript dilinde yazılmış kullanıcı tanımlı işlevleri destekler. JavaScript'in sağladığı zengin String, RegExp, Math, Array ve Date yöntemleriyle Stream Analytics işleriyle karmaşık veri dönüşümleri oluşturmak daha kolay hale gelir.

Genel Bakış

JavaScript kullanıcı tanımlı işlevler, dış bağlantı gerektirmeyen durum bilgisi olmayan, yalnızca işlem tabanlı skaler işlevleri destekler. Bir işlevin dönüş değeri yalnızca skaler (tek) değer olabilir. JavaScript kullanıcı tanımlı işlevini bir işe ekledikten sonra işlevi, yerleşik bir skaler değerli işlev gibi sorgunun herhangi bir yerinde kullanabilirsiniz.

JavaScript kullanıcı tanımlı işlevlerini yararlı bulabileceğiniz bazı senaryolar aşağıda verilmiştir:

  • Normal ifade işlevlerine sahip dizeleri ayrıştırma ve düzenleme; örneğin, Regexp_Replace() and Regexp_Extract()
  • İkili-onaltılık dönüşüm gibi verilerin kodunu çözme ve kodlama
  • JavaScript Matematik işlevleriyle matematik hesaplamaları yapma
  • Sıralama, birleştirme, bulma ve doldurma gibi dizi işlemleri gerçekleştirme

Stream Analytics'te JavaScript kullanıcı tanımlı işleviyle şu işlemleri yapamazsınız:

  • Dış REST uç noktalarını çağırma, örneğin ters IP araması yapma veya dış kaynaktan başvuru verilerini çekme
  • Girdiler/çıktılar üzerinde özel durum serileştirme veya seri durumdan çıkarma işlemi gerçekleştirme
  • Özel toplam değerler oluşturma

Date.GetDate() veya Math.random() gibi işlevler işlev tanımında engellenmese de, bunları kullanmaktan kaçınmanız gerekir. Bu işlevler her çağırdığınızda aynı sonucu döndürmez ve Azure Stream Analytics hizmeti işlev çağrılarının ve döndürülen sonuçların günlüğünü tutmaz. Bir işlev aynı olaylarda farklı sonuç döndürürse, bir iş sizin tarafınızdan veya Stream Analytics hizmeti tarafından yeniden başlatıldığında yinelenebilirlik garanti edilir.

İşinize JavaScript kullanıcı tanımlı işlev ekleme

Not

Bu adımlar, bulutta çalışacak şekilde yapılandırılmış Stream Analytics işlerinde çalışır. Stream Analytics işiniz Azure IoT Edge üzerinde çalışacak şekilde yapılandırılmışsa, bunun yerine Visual Studio'yu kullanın ve C# kullanarak kullanıcı tanımlı işlevi yazın.

Stream Analytics işinizde JavaScript kullanıcı tanımlı bir işlev oluşturmak için İş Topolojisi'nin altında İşlevler'i seçin. Ardından + Ekle açılan menüsünden JavaScript UDF'yi seçin.

JavaScript UDF ekleme

Ardından aşağıdaki özellikleri sağlamanız ve Kaydet'i seçmeniz gerekir.

Özellik Açıklama
İşlev diğer adı Sorgunuzda işlevi çağırmak için bir ad girin.
Çıkış türü JavaScript kullanıcı tanımlı işleviniz tarafından Stream Analytics sorgunuza döndürülecek tür.
İşlev tanımı UDF'niz sorgunuzdan her çağrıldığında yürütülecek JavaScript işlevinizin uygulanması.

JavaScript UDF'lerini test edin ve sorunlarını giderin

JavaScript UDF mantığınızı herhangi bir tarayıcıda test edebilir ve hatalarını ayıklayabilirsiniz. Bu kullanıcı tanımlı işlevlerin mantığında hata ayıklama ve test etme şu anda Stream Analytics portalında desteklenmemektedir. İşlev beklendiği gibi çalıştığında, yukarıda belirtildiği gibi Stream Analytics işine ekleyebilir ve ardından doğrudan sorgunuzdan çağırabilirsiniz. Visual Studio için Stream Analytics araçlarını kullanarak Sorgu mantığınızı JavaScript UDF ile test edebilirsiniz.

JavaScript çalışma zamanı hataları önemli kabul edilir ve Etkinlik günlüğünde öne çıkarılır. Günlüğü almak için Azure portalında işinize gidin ve Etkinlik günlüğü’nü seçin.

Bir sorguda JavaScript kullanıcı tanımlı işlevi çağırma

udf ön ekli işlev diğer adını kullanarak sorgunuzda JavaScript işlevinizi kolayca çağırabilirsiniz. Burada, bir Stream Analytics sorgusunda çağrılan onaltılık değerleri tamsayıya dönüştüren bir JavaScript UDF örneği verilmiştir.

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

Desteklenen JavaScript nesneleri

Azure Stream Analytics JavaScript kullanıcı tanımlı işlevleri standart, yerleşik JavaScript nesnelerini destekler. Bu nesnelerin bir listesi için bkz. Genel Nesneler.

Stream Analytics ve JavaScript tür dönüşümü

Stream Analytics sorgu dili ile JavaScript’in desteklediği türler arasında farklılıklar vardır. Bu tabloda ikisi arasındaki dönüştürme eşlemeleri listelenmektedir:

Stream Analytics JavaScript
bigint Sayı (JavaScript yalnızca tam olarak 2^53’e kadar tamsayıları temsil edebilir)
DateTime Tarih (JavaScript yalnızca milisaniye birimini destekler)
double Sayı
nvarchar(MAX) Dize
Kayıt Nesne
Dizi Dizi
NULL Null

JavaScript’ten Stream Analytics’e dönüşümler aşağıda verilmiştir:

JavaScript Stream Analytics
Sayı Bigint (sayı yuvarlak ve long.MinValue ile long.MaxValue arasındaysa; aksi takdirde iki katıdır)
Tarih DateTime
Dize nvarchar(MAX)
Nesne Kayıt
Dizi Dizi
Null, Tanımsız NULL
Başka bir tür (örneğin, bir işlev veya hata) Desteklenmiyor (çalışma zamanı hatası ile sonuçlanır)

JavaScript dili büyük/küçük harfe duyarlıdır ve JavaScript kodundaki nesne alanlarının büyük/küçük harfleri gelen verilerdeki alanların büyük/küçük harfleriyle eşleşmelidir. Uyumluluk düzeyi 1.0 olan işler, SQL SELECT deyimindeki alanları küçük harfe dönüştürür. Uyumluluk düzeyi 1.1 ve üzeri altında, SELECT deyimindeki alanlar SQL sorgusunda belirtilen büyük/küçük harfle aynı büyük/küçük harfe sahip olur.

Diğer JavaScript kullanıcı tanımlı işlev desenleri

Çıktıya iç içe geçmiş JSON yazma

Girdi olarak bir Stream Analytics iş çıktısını kullanan bir takip işleme adımınız varsa ve bir JSON biçimi gerektiriyorsa, çıktıya bir JSON dizesi yazabilirsiniz. Aşağıdaki örnekte girdinin tüm ad/değer çiftlerini paketlemek ve sonra bunları çıktıda tek bir dize olarak yazmak için JSON.stringify() işlevi çağrılmaktadır.

JavaScript kullanıcı tanımlı işlev tanımı:

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

Örnek sorgu:

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

İşlenmek üzere JSON nesnesine dize atama

JSON olan bir dize alanınız varsa ve bunu JavaScript UDF'de işlenmek üzere JSON nesnesine dönüştürmek istiyorsanız, JSON.parse() işlevini kullanarak daha sonra kullanılabilecek bir JSON nesnesi oluşturabilirsiniz.

JavaScript kullanıcı tanımlı işlev tanımı:

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

Örnek sorgu:

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

Hata işleme için try/catch kullanma

Try/catch blokları, JavaScript UDF'ye geçirilen hatalı biçimlendirilmiş giriş verileriyle ilgili sorunları belirlemenize yardımcı olabilir.

JavaScript kullanıcı tanımlı işlev tanımı:

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

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

Örnek sorgu: Hata olduğunda döndürülebilmesi için kaydın tamamını ilk parametre olarak geçirin.

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

toLocaleString()

JavaScript'teki toLocaleString yöntemi, bu yöntemin çağrıldığı tarih saat verilerini temsil eden dile duyarlı bir dize döndürmek için kullanılabilir. Azure Stream Analtyics yalnızca UTC tarih saatini sistem zaman damgası olarak kabul etse de, bu yöntem sistem zaman damgasını başka bir yerel ayara ve saat dilimine kapatmak için kullanılabilir. Bu yöntem, Internet Explorer'da bulunanla aynı uygulama davranışını izler.

JavaScript kullanıcı tanımlı işlev tanımı:

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

Örnek sorgu: Tarih saat değerini giriş değeri olarak geçirme

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

Bu sorgunun çıkışı, sağlanan seçeneklerle de-DE'de datetime girişi olacaktır.

Samstag, 28. Dezember 2019

Kullanıcı Günlüğü

Günlüğe kaydetme mekanizması, kullanıcıların bir iş çalışırken özel bilgileri yakalamasına olanak tanır. Günlük verileri, gerçek zamanlı olarak özel kodun hatalarını ayıklamak veya doğruluğunu değerlendirmek için kullanılabilir. Bu mekanizma üç farklı yöntemle kullanılabilir.

Console.Info()

Console.Info yöntemi, kod yürütme sırasında genel bilgileri günlüğe kaydetmek için kullanılır. Bu yöntem, hesaplamayı kesintiye uğratmadan verileri günlüğe kaydeder. Günlüğe kaydedilen ileti Olay Düzeyi Bilgilendirme olarak işaretlenir.

console.info('my info message');

Console.Warn()

Console.Warn yöntemi, doğru veya beklenen olmayabilecek ancak yine de hesaplama için kabul edilen verileri günlüğe kaydetmek için kullanılır. Bu yöntem hesaplamayı kesintiye uğratmaz ve yöntem döndürüldükten sonra çalışmaya devam eder. Günlüğe kaydedilen ileti Olay Düzeyi Uyarısı olarak işaretlenir.

console.warn('my warning message');

Console.Error() ve Console.Log()

Console.Error yöntemi yalnızca kodun çalışmaya devam edemediği hata durumlarını günlüğe kaydetmek için kullanılır. Bu yöntem, giriş parametresi ve iş çalışmayı durduracağı için sağlanan hata bilgileriyle bir özel durum oluşturur. Günlüğe kaydedilen hata iletisi Olay Düzeyi Hatası olarak işaretlenir.

console.error('my error message');

Tanılama günlükleri aracılığıyla günlük iletilerine erişebilirsiniz.

atob() ve btoa()

btoa() yöntemi bir ASCII dizesini Base64'e kodlamak için kullanılabilir. Bu genellikle verileri ikili biçimde aktarmak için yapılır. atob() yöntemi, Base64'te kodlanmış bir veri dizesinin kodunu ASCII dize biçiminde çözmek için kullanılabilir.

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

Sonraki adımlar