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é JavaScript nabízí, je vytváření složitých transformací dat pomocí úloh Stream Analytics jednodušší.

Přehled

Uživatelem definované funkce JavaScriptu podporují bezstavové skalární funkce jen pro výpočty, 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í matematických funkcí JavaScriptu
  • Provádění operací pole, jako je řazení, spojování, hledání a vyplňování

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

  • Volání externích koncových bodů REST, například zpětné vyhledávání IP adresy nebo načítá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í

Přestože funkce jako Date.GetDate() nebo Math.random() nejsou v definici funkcí blokovány, měli byste se jejich používání vyhnout. Tyto funkce nevrací při každém volání stejný výsledek a služba Azure Stream Analytics neudržuje deník volání funkcí a vrácených výsledků. Pokud funkce vrátí jiný výsledek u stejných událostí, není opakovatelnost při restartování úlohy vámi nebo službou Stream Analytics zaručena.

Přidání uživatelem definované funkce JavaScriptu 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, použijte místo toho Visual Studio a zapište uživatelem definovanou funkci pomocí jazyka C#.

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

Přidání UDF 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ý vrátí uživatelem definovaná funkce JavaScriptu do dotazu Stream Analytics.
Definice funkce Implementace funkce JavaScriptu, která se spustí při každém vyvolání funkce definované uživatelem z dotazu.

Testování a řešení potíží s uživatelsky definovanými funkcemi JavaScriptu

Logiku UDF JavaScriptu můžete testovat a ladit v libovolném prohlížeči. Na portálu Stream Analytics se v současné době nepodporuje ladění a testování logiky těchto uživatelem definovaných funkcí. 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 funkce definované uživatelem JavaScriptu, která převádí šestnáctkové hodnoty na celé číslo vyvolané 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 Číslo
nvarchar(MAX) Řetězec
Záznam Objekt
Pole Pole
NULL Null

Převody z jazyka JavaScript do Stream Analytics:

JavaScript Stream Analytics
Číslo Bigint (pokud je číslo zaokrouhlené a je v rozsahu long.MinValue a long.MaxValue; jinak typ double)
Datum DateTime
Řetězec nvarchar(MAX)
Objekt Záznam
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 JavaScript rozlišuje velká a malá písmena a velká písmena v polích objektu v kódu JavaScriptu se musí shodovat s velikostí 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 mít pole z příkazu SELECT stejná velikost velikosti, jako jsou zadaná 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 ke zpracování

Pokud máte pole řetězce, které je JSON, a chcete ho převést na objekt JSON pro zpracování v JavaScriptu UDF, můžete pomocí funkce JSON.parse() vytvořit objekt JSON, který pak bude možné 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 ke zpracování chyb

Bloky try/catch vám můžou pomoct identifikovat problémy s poškozenými vstupními daty, která se předávají do funkce definované 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: Předejte celý záznam jako první parametr, 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()

ToLocaleString Metoda v JavaScriptu lze použít k vrácení řetězce citlivého na jazyk, který představuje data data data a času, ze kterého je tato metoda volána. I když Azure Stream Analtyics jako systémové časové razítko přijímá pouze datum a čas UTC, dá se tato metoda použít ke skrytí systémového časového razítka pro jiné národní prostředí a časové pásmo. Tato metoda se řídí stejným chováním implementace jako ten, 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í hodnoty datetime 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 poskytnutými možnostmi.

Samstag, 28. Dezember 2019

Protokolování uživatelů

Mechanismus protokolování umožňuje uživatelům zachytávat vlastní informace, když je úloha spuštěná. Data protokolu lze 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 se používá k protokolování obecných informací během provádění kódu. Tato metoda protokoluje data bez přerušení výpočtu. Zaprotokolovaná zpráva 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 jsou stále přijímána pro výpočet. Tato metoda nepřeruší výpočet a po vrácení metody bude pokračovat v provozu. Zaprotokolovaná zpráva bude označena jako upozornění na úrovni události.

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ými jako vstupní parametr a úloha se zastaví. Zaprotokolovaná chybová zpráva bude označena 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. To se obvykle provádí za účelem přenosu dat v binárním formátu. Metodu atob() lze použít k dekódování řetězce dat zakódovaného v Base64 do formátu řetězce ASCII.

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

Další kroky