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


JavaScript felhasználó által definiált 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 széles választékának köszönhetően könnyebben hozhatók létre összetett adatátalakítások Stream Analytics-feladatokkal.

Áttekintés

A JavaScript felhasználó által definiált függvények támogatják az állapot nélküli, csak számítással rendelkező skaláris függvényeket, amelyek nem igényelnek külső kapcsolatot. 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 használata 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() nem blokkolva vannak a függvénydefinícióban, kerülje a használatukat. Ezek a függvények nem minden híváskor ugyanazt az eredményt adják vissza, és az Azure Stream Analytics szolgáltatás nem tartja meg a függvényhívások naplóját és az eredményeket. Ha egy függvény ugyanazon eseményeken eltérő eredményt ad vissza, az ismétlődés 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

Feljegyzé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-en fusson, használja a Visual Studiót, és írja meg a felhasználó által definiált függvényt a C# használatával.

Ha a Stream Analytics-feladatban felhasználó által definiált JavaScript-függvényt szeretne létrehozni, válassza a Feladatok topológia területén található 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.
Kimeneti típus A JavaScript felhasználó által definiált függvény által a Stream Analytics-lekérdezéshez visszaadott típus.
Függvénydefiníció A JavaScript-függvény implementálása, amelyet a rendszer minden alkalommal végrehajt, amikor az UDF-et meghívják a lekérdezésből.

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 közvetlenül a lekérdezésből hívhatja meg. A lekérdezési logikát JavaScript UDF-lel tesztelheti a Visual Studióhoz készült Stream Analytics-eszközökkel.

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ény aliasával. Íme egy példa egy JavaScript UDF-ra, 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)
Dátum/idő Dátum (a JavaScript csak az ezredmásodperceket támogatja)
double Szám
nvarchar(MAX) Sztring
Rögzítés 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 Dátum/idő
Sztring nvarchar(MAX)
Objektum Rögzítés
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 kompatibilitási szintű feladatok az SQL SELECT utasítás mezőit kisbetűssé alakítják. Az 1.1-es és újabb kompatibilitási szintnél a SELECT utasítás mezőinek ugyanolyan a burkolata, 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

A feldolgozandó JSON-objektumra öntött sztring

Ha JSON karakterláncmezővel rendelkezik, és JSON-objektummá szeretné alakítani a JavaScript UDF-ben való feldolgozáshoz, a JSON.parse() függvény használatával létrehozhat egy JSON-objektumot, amely ezutá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 hibakezeléshez használja a try/catch függvényt

A kipróbálási/fogási blokkok segíthetnek azonosítani a JavaScript UDF-be továbbított helytelenül formázott 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;
}

Minta lekérdezés: Adja át a teljes rekordot első paraméterként, hogy hiba esetén visszaadható legyen.

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

toLocaleString()

A JavaScript toLocaleString metódusa nyelvérzékeny sztring visszaadására használható, amely a metódus meghívásának dátum-idő adatait jelöli. Annak ellenére, hogy az Azure Stream Analytics csak az UTC dátumidőt fogadja el rendszeridőbélyegként, ez a módszer a rendszer időbélyegének egy másik területi és időzónára való lefedésére használható. Ez a módszer ugyanazt a megvalósítási viselkedést követi, mint az Internet Explorerben elérhető.

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

Minta leké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. December 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 valós idejű hibakeresésére vagy helyességének felméré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ű információské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 esetleg nem helyesek vagy várhatóak, de a számításokhoz továbbra is elfogadottak. 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ó, ahol a kód nem fut tovább. Ez a metódus kivételt okoz a megadott hibainformációkkal, mivel a bemeneti paraméter és a feladat futása leáll. 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átumba lehet dekódolni.

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

Következő lépések