Megosztás a következőn keresztül:


Felhasználó által definiált JavaScript-függvények az Azure Stream Analyticsben

Az Azure Stream Analytics támogatja a JavaScript nyelven írt felhasználói függvényeket. A JavaScript által biztosított String, RegExp, Math, Array és Date metódusok gazdag készletével egyszerűbbé válik a Stream Analytics-feladatokkal végzett összetett adatátalakítások létrehozása.

Áttekintés

A JavaScript felhasználó által definiált függvényei támogatják az állapot nélküli, csak számítással használható skaláris függvényeket, amelyekhez nincs szükség külső kapcsolatra. Egy függvény visszaadott értéke csak skaláris (egyetlen) érték lehet. Miután hozzáadott egy felhasználói JavaScript-függvényt egy feladathoz, bárhol használhatja a függvényt a lekérdezésben, egy beépített skaláris függvényhez hasonlóan.

Az alábbiakban bemutatunk néhány forgatókönyvet, amelyekben hasznosnak találhatja a felhasználói JavaScript-függvényeket:

  • Reguláriskifejezés-függvényeket (például: Regexp_Replace() és Regexp_Extract()) tartalmazó sztringek elemzése és módosítása.
  • Adatok dekódolása és kódolása, például bináris adatok átalakítása hexadecimális adatokká.
  • Matematikai számítások javaScript matematikai függvényekkel
  • Tömbműveletek, például rendezés, illesztés, keresés és kitöltés végrehajtása

Íme néhány dolog, amit nem lehet elvégezni a JavaScript felhasználó által definiált függvényeivel a Stream Analyticsben:

  • Külső REST-végpontok meghívása, például fordított IP-keresés vagy referenciaadatok lekérése külső forrásból
  • Egyéni eseményformátum szerializálása vagy deszerializálása bemenetekben/kimenetekben.
  • Egyéni összesítések létrehozása.

Bár az olyan függvények, mint a Date.GetDate() vagy a Math.random() nincsenek blokkolva a függvénydefinícióban, érdemes elkerülni a használatukat. Ezek a függvények nem minden híváskor ugyanazt az eredményt adnak vissza, és az Azure Stream Analytics szolgáltatás nem őrzi meg a függvénymeghívások naplóját, és nem ad vissza eredményeket. Ha egy függvény ugyanazon eseményeken eltérő eredményt ad vissza, az ismételhetőség nem garantált, ha Ön vagy a Stream Analytics szolgáltatás újraindít egy feladatot.

Felhasználó által definiált JavaScript-függvény hozzáadása a feladathoz

Megjegyzés

Ezek a lépések a felhőben való futtatásra konfigurált Stream Analytics-feladatokon működnek. Ha a Stream Analytics-feladat úgy van konfigurálva, hogy az Azure IoT Edge futjon, használja a Visual Studiót, és írja meg a felhasználó által definiált függvényt a C# használatával.

Ha felhasználó által definiált JavaScript-függvényt szeretne létrehozni a Stream Analytics-feladatban, válassza a Feladatok topológiája területen a Függvények lehetőséget. Ezután válassza a JavaScript UDF elemet a +Hozzáadás legördülő menüből.

JavaScript UDF hozzáadása

Ezután meg kell adnia a következő tulajdonságokat, és válassza a Mentés lehetőséget.

Tulajdonság Leírás
Függvény aliasa Adjon meg egy nevet a függvény lekérdezésben való meghívásához.
Kimenet típusa A JavaScript felhasználó által definiált függvény által a Stream Analytics-lekérdezésbe visszaadott típus.
Függvénydefiníció A JavaScript-függvény implementálása, amelyet a rendszer minden alkalommal végrehajt, amikor a lekérdezésből meghívják az UDF-et.

JavaScript UDF-ek tesztelése és hibaelhárítása

A JavaScript UDF-logikát bármely böngészőben tesztelheti és hibakeresésre használhatja. A Felhasználó által definiált függvények logikájának hibakeresése és tesztelése jelenleg nem támogatott a Stream Analytics portálon. Ha a függvény a várt módon működik, hozzáadhatja a Fent említett Stream Analytics-feladathoz, majd meghívhatja közvetlenül a lekérdezésből. A lekérdezési logikát JavaScript UDF-lel tesztelheti a Visual Studio Stream Analytics-eszközeivel.

A JavaScript futásidejű hibái végzetesnek minősülnek, és a tevékenységnaplóban tekinthetők meg. A napló lekéréséhez lépjen a feladatra az Azure Portalon, és válassza a Tevékenységnapló elemet.

Felhasználói JavaScript-függvény meghívása lekérdezésben

A Lekérdezésben egyszerűen meghívhatja a JavaScript-függvényt az udf előtaggal ellátott függvényalias használatával. Íme egy példa egy JavaScript UDF-re, amely a hexadecimális értékeket egy Stream Analytics-lekérdezésben meghívott egész számmá alakítja.

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

Támogatott JavaScript-objektumok

Az Azure Stream Analytics felhasználói JavaScript-függvényei támogatják a szabványos, beépített JavaScript-objektumokat. Az objektumok listáját a globális objektumokkal foglalkozó cikkben tekintheti meg.

Típusátalakítás a Stream Analytics és a JavaScript között

A Stream Analytics lekérdezési nyelv és a JavaScript által támogatott típusok között különbségek vannak. Az alábbi táblázat a kettő közötti átalakítás megfeleléseit tartalmazza:

Stream Analytics JavaScript
bigint Szám (a JavaScript legfeljebb pontosan a 2^53-ig tudja a számokat kezelni)
DateTime Dátum (a JavaScript csak az ezredmásodperceket támogatja)
double Szám
nvarchar(MAX) Sztring
Rekord Objektum
Tömb Tömb
NULL Null

A JavaScriptről a Stream Analyticsre történő átalakítások:

JavaScript Stream Analytics
Szám Bigint (ha a szám kerek és a long.MinValue és a long.MaxValue közé esik, máskülönben double)
Dátum DateTime
Sztring nvarchar(MAX)
Objektum Rekord
Tömb Tömb
Null, nem definiált NULL
Bármely más típus (például függvény vagy hiba) Nem támogatott (futásidejű hibát eredményez)

A JavaScript nyelv megkülönbözteti a kis- és nagybetűket, és a JavaScript-kód objektummezőinek burkolatának meg kell egyeznie a bejövő adatok mezőinek burkolatával. Az 1.0-s kompatibilitási szinttel rendelkező feladatok az SQL SELECT utasítás mezőit kisbetűssé alakítják. Az 1.1-es és újabb kompatibilitási szint alatt a SELECT utasítás mezőinek ugyanolyan burkolata lesz, mint az SQL-lekérdezésben.

Egyéb felhasználói JavaScript-függvényminták

Beágyazott JSON írása a kimenetbe

Ha van még egy további feldolgozási lépés, amely a Stream Analytics-feladat kimenetét használja a bemeneteként, és JSON-formátumot igényel, a kimenetbe írhat JSON-sztringet. A következő példa a JSON.stringify() függvény meghívásával becsomagolja a bemenetben lévő összes név/érték párt, majd egyetlen sztringértékként írja őket a kimenetbe.

Felhasználói JavaScript-függvény definíciója:

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

Mintalekérdezés:

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

Sztring formázása JSON-objektumra feldolgozandó

Ha JSON-karakterláncmezővel rendelkezik, és JSON-objektummá szeretné konvertálni egy JavaScript UDF-ben való feldolgozáshoz, a JSON.parse() függvénnyel létrehozhat egy JSON-objektumot, amelyet aztán használhat.

Felhasználói JavaScript-függvény definíciója:

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

Mintalekérdezés:

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

A try/catch használata hibakezeléshez

A try/catch blokkok segíthetnek azonosítani a JavaScript UDF-be továbbított helytelen formátumú bemeneti adatokkal kapcsolatos problémákat.

Felhasználói JavaScript-függvény definíciója:

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

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

Mintalekérdezés: Adja át a teljes rekordot első paraméterként, hogy hiba esetén vissza lehessen adni.

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

toLocaleString()

A JavaScript toLocaleString metódusával nyelvérzékeny sztringet adhat vissza, amely a metódus meghívásának dátum-időadatait jelöli. Annak ellenére, hogy az Azure Stream Analtyics csak az UTC dátumidőt fogadja el rendszer-időbélyegként, ezzel a módszerrel a rendszer időbélyege egy másik területi beállításra és időzónára is kiterjedhet. Ez a metódus az Internet Explorerben elérhető implementálási viselkedést követi.

Felhasználói JavaScript-függvény definíciója:

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

Mintalekérdezés: Dátum/idő megadása bemeneti értékként

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

A lekérdezés kimenete a de-DE bemeneti dátumideje lesz a megadott beállításokkal.

Samstag, 28. Dezember 2019

Felhasználónaplózás

A naplózási mechanizmus lehetővé teszi, hogy a felhasználók egyéni adatokat rögzítsenek egy feladat futtatása közben. A naplóadatok felhasználhatók az egyéni kód hibakeresésére vagy helyességének valós idejű értékelésére. Ez a mechanizmus három különböző módszerrel érhető el.

Console.Info()

Console.Info metódussal naplózhatja az általános információkat a kód végrehajtása során. Ez a módszer a számítás megszakítása nélkül naplózza az adatokat. A naplózott üzenet eseményszintű tájékoztatóként lesz megjelölve.

console.info('my info message');

Console.Warn()

A Console.Warn metódus olyan adatok naplózására szolgál, amelyek nem helyesek vagy vártak, de továbbra is használhatók számításokhoz. Ez a metódus nem szakítja meg a számítást, és a metódus visszaadása után folytatódik. A naplózott üzenet eseményszintű figyelmeztetésként lesz megjelölve.

console.warn('my warning message');

Console.Error() és Console.Log()

A Console.Error metódus csak olyan hibaesetek naplózására használható, amikor a kód nem tud tovább futni. Ez a metódus kivételt jelez a bemeneti paraméter és a feladat futásának leállása miatt megadott hibainformációkkal. A naplózott hibaüzenet eseményszintű hibaként lesz megjelölve.

console.error('my error message');

A naplóüzeneteket a diagnosztikai naplókon keresztül érheti el.

atob() és btoa()

A btoa() metódussal ASCII-sztringeket kódolhat Base64-be. Ez általában bináris formátumban történik az adatok átviteléhez. Az atob() metódussal a Base64-ben kódolt adatsztringeket ASCII-sztringformátumban lehet dekódolni.

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

Következő lépések