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