Sdílet prostřednictvím


Uživatelem definované funkce JavaScriptu v Azure Stream Analytics

Azure Stream Analytics podporuje uživatelem definované funkce, které jsou napsané v jazyce JavaScript. Díky bohaté sadě metod String, RegExp, Math, Array a Date, které jazyk JavaScript poskytuje, je teď vytváření komplexních transformací dat pomocí úloh Stream Analytics snadnější.

Přehled

Uživatelem definované funkce JavaScriptu podporují bezstavové skalární skalární funkce, které nevyžadují externí připojení. Návratovou hodnotou funkce může být jenom skalární (jediná) hodnota. Po přidání uživatelem definované funkce jazyka JavaScript do úlohy lze danou funkci použít kdekoli v dotazu jako integrovanou skalární funkci.

Některé scénáře, ve kterých můžou být uživatelem definované funkce jazyka JavaScript užitečné:

  • Analýza a manipulace s řetězci, které obsahují funkce s regulárními výrazy, například Regexp_Replace() a Regexp_Extract()
  • Kódování a dekódování dat, například převod z binárního kódování na šestnáctkové kódování
  • Provádění matematických výpočtů pomocí javascriptových matematických funkcí
  • Provádění operací s poli, jako je řazení, spojení, hledání a vyplnění

Tady je několik věcí, které nemůžete dělat s uživatelem definovanou funkcí JavaScriptu ve Stream Analytics:

  • Volání externích koncových bodů REST, například vyhledávání reverzníCH IP adres nebo vyžádání referenčních dat z externího zdroje
  • Provádění vlastní serializace nebo deserializace formátu událostí u vstupů nebo výstupů
  • Vytváření vlastních agregací

I když funkce jako Date.GetDate() nebo Math.random() nejsou v definici funkcí blokované, měli byste se jim vyhnout. Tyto funkce nevrací stejný výsledek pokaždé, když je zavoláte, a služba Azure Stream Analytics neuchová deník vyvolání a vrácených výsledků. Pokud funkce vrátí jiný výsledek u stejných událostí, nezaručuje opakovatelnost při restartování úlohy vámi nebo službou Stream Analytics.

Přidání uživatelem definované funkce Jazyka JavaScript do úlohy

Poznámka:

Tyto kroky fungují na úlohách Stream Analytics nakonfigurovaných tak, aby běžely v cloudu. Pokud je vaše úloha Stream Analytics nakonfigurovaná tak, aby běžela v Azure IoT Edge, místo toho použijte Visual Studio a napište uživatelem definovanou funkci pomocí jazyka C#.

Pokud chcete v úloze Stream Analytics vytvořit uživatelem definovanou funkci JavaScriptu, vyberte v části Topologie úlohy funkce. Pak v rozevírací nabídce +Add (Přidat) vyberte UDF JavaScriptu.

Přidání uživatelem definovaného kódu JavaScriptu

Pak musíte zadat následující vlastnosti a vybrat Uložit.

Vlastnost Popis
Alias funkce Zadejte název pro vyvolání funkce v dotazu.
Typ výstupu Typ, který bude vrácen uživatelem definovanou funkcí JavaScriptu do dotazu Stream Analytics.
Definice funkce Implementace javascriptové funkce, která se spustí při každém vyvolání uživatelem definovaného uživatelem z dotazu.

Testování a řešení potíží s uživatelem definovaných uživatelem JavaScriptu

Logiku definovanou uživatelem JavaScriptu můžete testovat a ladit v libovolném prohlížeči. Ladění a testování logiky těchto uživatelem definovaných funkcí se v současné době na portálu Stream Analytics nepodporuje. Jakmile funkce funguje podle očekávání, můžete ji přidat do úlohy Stream Analytics, jak je uvedeno výše, a pak ji vyvolat přímo z dotazu. Logiku dotazu můžete otestovat pomocí UDF JavaScriptu pomocí nástrojů Stream Analytics pro Visual Studio.

Chyby jazyka JavaScript za běhu se považují za závažné a zobrazují se prostřednictvím protokolu aktivit. Pokud chcete protokol načíst, přejděte na portálu Azure Portal na příslušnou úlohu a vyberte Protokol aktivit.

Volání uživatelem definované funkce jazyka JavaScript v dotazu

Funkci JavaScriptu v dotazu můžete snadno vyvolat pomocí aliasu funkce s předponou udf. Tady je příklad uživatelem definovaného kódu JavaScriptu, který převede šestnáctkové hodnoty na celé číslo, které se vyvolá v dotazu Stream Analytics.

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

Podporované objekty jazyka JavaScript

Uživatelem definované funkce jazyka JavaScript v Azure Stream Analytics podporují standardní předdefinované objekty jazyka JavaScript. Seznam těchto objektů najdete v tématu Globální objekty.

Převod typů pro Stream Analytics a JavaScript

Mezi typy podporovanými dotazovacím jazykem Stream Analytics a jazykem JavaScript existují rozdíly. Tato tabulka uvádí mapování převodu mezi těmito dvěma jazyky:

Stream Analytics JavaScript
bigint Číslo (JavaScript může používat celá čísla jenom do hodnoty 2^53)
DateTime Datum (JavaScript podporuje jenom milisekundy)
double Počet
nvarchar(MAX) String
Zaznamenat Objekt
Pole Pole
NULL Null

Převody z jazyka JavaScript do Stream Analytics:

JavaScript Stream Analytics
Počet Bigint (pokud je číslo zaokrouhlené a je v rozsahu long.MinValue a long.MaxValue; jinak typ double)
Date DateTime
String nvarchar(MAX)
Objekt Zaznamenat
Pole Pole
Null, Nedefinováno NULL
Jakýkoli jiný typ (například funkce nebo chyba) Nepodporuje se (výsledkem je chyba za běhu)

Jazyk JavaScriptu rozlišují malá a velká písmena polí objektů v kódu JavaScriptu musí odpovídat velikosti písmen polí v příchozích datech. Úlohy s úrovní kompatibility 1.0 převedou pole z příkazu SQL SELECT na malá písmena. V rámci úrovně kompatibility 1.1 a vyšší budou pole z příkazu SELECT mít stejnou velikost velikostí jako v dotazu SQL.

Další vzory uživatelem definovaných funkcí jazyka JavaScript

Zápis vnořeného řetězce JSON do výstupu

Pokud máte krok následného zpracování, který jako vstup používá výstup úlohy Stream Analytics a vyžaduje formát JSON, můžete do výstupu zapsat řetězec JSON. V dalším příkladu se volá funkce JSON.stringify(), která sbalí všechny dvojice název/hodnota ve vstupu a pak je zapíše jako jedinou hodnotu řetězce do výstupu.

Definice uživatelem definované funkce jazyka JavaScript:

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

Ukázkový dotaz:

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

Přetypování řetězce na objekt JSON pro zpracování

Pokud máte pole řetězce, které je JSON a chcete ho převést na objekt JSON pro zpracování v UDF JavaScriptu, můžete pomocí funkce JSON.parse() vytvořit objekt JSON, který se pak dá použít.

Definice uživatelem definované funkce jazyka JavaScript:

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

Ukázkový dotaz:

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

Použití příkazu try/catch pro zpracování chyb

Bloky try/catch vám můžou pomoct identifikovat problémy s poškozenými vstupními daty předávanými do uživatelem definovaného uživatelem JavaScriptu.

Definice uživatelem definované funkce jazyka JavaScript:

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

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

Ukázkový dotaz: Jako první parametr předejte celý záznam, aby se mohl vrátit, pokud dojde k chybě.

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

toLocaleString()

Metodu toLocaleString v JavaScriptu lze použít k vrácení jazyka citlivého řetězce, který představuje data a času, ze kterého se tato metoda volá. I když Azure Stream Analytics jako systémové časové razítko přijímá jako časové razítko pouze datum UTC, lze tuto metodu použít k pokrytí systémového časového razítka do jiného národního prostředí a časového pásma. Tato metoda se řídí stejným chováním implementace jako metoda, která je k dispozici v aplikaci Internet Explorer .

Definice uživatelem definované funkce jazyka JavaScript:

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

Ukázkový dotaz: Předání data a času jako vstupní hodnoty

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

Výstupem tohoto dotazu bude vstupní datum a čas v de-DE s dostupnými možnostmi.

Samstag, 28. Dezember 2019

Protokolování uživatele

Mechanismus protokolování umožňuje uživatelům zaznamenávat vlastní informace, když je úloha spuštěná. Data protokolu se dají použít k ladění nebo vyhodnocení správnosti vlastního kódu v reálném čase. Tento mechanismus je k dispozici prostřednictvím tří různých metod.

Console.Info()

Console.Info metoda slouží k protokolování obecných informací během provádění kódu. Tato metoda bude protokolovat data bez přerušení výpočtu. Zpráva zaprotokolovaná bude označena jako informace na úrovni událostí.

console.info('my info message');

Console.Warn()

Metoda Console.Warn se používá k protokolování dat, která nemusí být správná nebo očekávaná, ale stále se přijímají pro výpočty. Tato metoda nepřeruší výpočet a po vrácení metody se obnoví. Zpráva zaprotokolovaná bude označena jako upozornění na úrovni událostí.

console.warn('my warning message');

Console.Error() a Console.Log()

Metoda Console.Error se používá pouze k protokolování chybových případů, kdy kód nemůže pokračovat ve spuštění. Tato metoda vyvolá výjimku s informacemi o chybě zadané jako vstupní parametr a úloha se zastaví. Zaprotokolovaná chybová zpráva se označí jako chyba na úrovni události.

console.error('my error message');

Ke zprávám protokolu můžete přistupovat prostřednictvím diagnostických protokolů.

atob() a btoa()

Metodu btoa() lze použít ke kódování řetězce ASCII do Base64. Obvykle se to provádí při přenosu dat v binárním formátu. Metoda atob() lze použít k dekódování řetězce dat kódovaného v Base64 do formátu řetězce ASCII.

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

Další kroky