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.
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);