Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Azure Stream Analytics поддерживает определяемые пользователем функции, написанные на языке JavaScript. Используя богатый набор методов String, RegExp, Math, Array и Date , который предоставляет JavaScript, вы можете создавать сложные преобразования данных в задачах Stream Analytics. Определяемые пользователем функции JavaScript поддерживают скалярные вычислительные функции без отслеживания состояния, не требующие внешнего подключения. Возвращаемое значение функции может быть только скалярным (одиночным). Добавив в задание определяемую пользователем функцию JavaScript, вы сможете использовать ее в любом месте запроса, например во встроенной скалярной функции.
В этой статье описывается, когда использовать пользовательские функции JavaScript и как их определять и вызывать в ваших задачах Stream Analytics.
Когда использовать пользовательскую функцию JavaScript
Ниже приведены некоторые сценарии, в которых могут пригодиться определяемые пользователем функции JavaScript.
- Разбор и обработка строк с помощью регулярных выражений, например , Regexp_Replace() и Regexp_Extract()
- Декодирование и кодирование данных, например преобразование двоичных данных в шестнадцатеричные.
- Выполнение математических вычислений с помощью математических функций JavaScript
- Операции с массивами, такие как сортировка, присоединение, поиск и заполнение.
Вот некоторые вещи, которые нельзя сделать, используя пользовательскую функцию JavaScript в Stream Analytics:
- Например, вызывайте внешние REST-конечные точки, выполняя обратный IP-поиск или вытягивая ссылки из внешнего источника
- Выполнять сериализацию или десериализацию в пользовательском формате событий для входных или выходных данных
- Создание пользовательских статистических функций.
Хотя такие функции, как Date.GetDate() или Math.random(), не запрещены в определении функций, избегайте их использования. Эти функции возвращают разные результаты при каждом вызове, а служба Azure Stream Analytics не ведет журнал вызовов и возвращаемых результатов для функций. Если функция возвращает другой результат для одних и тех же событий, повторяемость результатов не гарантируется, если задание перезапускаете вы или служба Stream Analytics.
Определите пользовательскую функцию JavaScript в портале Azure
Для задачи Stream Analytics, работающей в облаке, добавьте пользовательскую функцию JavaScript со страницы Functions в разделе Job Topology, где в меню +Add есть опция JavaScript UDF .
Примечание.
Этот опыт применяется к вакансиям в Stream Analytics, настроенных на работу в облаке. Если задание Stream Analytics настроено для работы в Azure IoT Edge, используйте вместо этого Visual Studio и напишите определяемую пользователем функцию, используя C#.
Определение функции состоит из следующих свойств:
| Свойство | Описание |
|---|---|
| Псевдоним функции | Имя, которое вызывает функцию в вашем запросе. |
| Тип выходных данных | Тип, который определяемая пользователем функция JavaScript возвращает для вашего запроса Stream Analytics. |
| Определение функции | Реализация вашей JavaScript-функции, которая запускается каждый раз, когда UDF вызывается из вашего запроса. |
Тестирование и устранение неполадок JavaScript UDF-логики
Поскольку портал Stream Analytics не поддерживает отладку и тестирование логики этих пользовательских функций, вы можете тестировать и отладить логику JavaScript UDF в любом браузере. Когда функция работает как ожидается, она готова добавить её в задачу Stream Analytics и вызвать её напрямую из вашего запроса. Вы также можете проверить логику запроса с помощью JavaScript UDF, используя инструменты Stream Analytics для Visual Studio.
Stream Analytics считает ошибки во время выполнения JavaScript фатальными и выводит их в журнал активности. Журнал доступен в портале Azure на странице журнала активности вашей работы.
Вызвать пользовательскую функцию JavaScript в запросе
Чтобы вызвать функцию JavaScript в запросе, используйте псевдоним функции с префиксом udf. Следующий пример показывает JavaScript-UDF, который преобразует шестнадцатеричные значения в целое в запросе Stream Analytics.
SELECT
time,
UDF.hex2Int(offset) AS IntOffset
INTO
output
FROM
InputStream
Поддерживаемые объекты JavaScript
Пользовательские функции JavaScript в Azure Stream Analytics поддерживают стандартные встроенные объекты JavaScript. Эти объекты предоставляют вашим функциям доступ к распространённым операциям со строками, математическими вычислениями, массивами и датами без какой-либо дополнительной настройки. Полный список доступных объектов см. раздел «Глобальные объекты». Поскольку язык запросов Stream Analytics и JavaScript не используют одну систему типов, Stream Analytics конвертирует значения по мере их передачи между ними.
Stream Analytics и преобразование типов в JavaScript
Язык запросов Stream Analytics и JavaScript поддерживают разные типы. В этой таблице перечислены соответствия преобразования между ними:
| Stream Analytics | JavaScript |
|---|---|
| bigint | Число (JavaScript может представлять целые числа только до значения 2^53). |
| Дата/время | Дата (JavaScript поддерживает только миллисекунды) |
| double | Число |
| nvarchar(MAX) | Строка |
| Запись | Объект |
| Массив | Массив |
| NULL | Null |
Ниже описаны преобразования из типов JavaScript в типы Stream Analytics.
| JavaScript | Stream Analytics |
|---|---|
| Число | Bigint (если число целое и находится между long.MinValue и long.MaxValue; в противном случае — double) |
| Дата | Дата/время |
| Строка | nvarchar(MAX) |
| Объект | Запись |
| Массив | Массив |
| NULL, не определено | NULL |
| Любой другой тип (например, функция или ошибка) | Не поддерживается (возникает ошибка времени выполнения) |
JavaScript чувствителен к регистру, и корпус объектных полей в JavaScript-коде должен совпадать с облицовкой полей в входящих данных. Задачи с уровнем совместимости 1.0 преобразуют поля в операторе SQL SELECT в нижний регистр. На уровне совместимости 1.1 и выше поля оператора SELECT имеют тот же корпус, что и в SQL-запросе.
Типичные функциональные паттерны
Следующие шаблоны показывают распространённые способы использования пользовательских функций JavaScript для преобразования данных в ваших запросах Stream Analytics. Каждый шаблон содержит определение функции и примерный запрос, вызывающий её.
Записать вложенный JSON в выходной поток
Если у вас есть последующий этап обработки, который использует выходные данные задания Stream Analytics в качестве входных данных, и ему требуется формат JSON, можно записать в выходные данные строку JSON. Следующее определение функции вызывает функцию JSON.stringify() для упаковки всех пар имён/значений входа и записывания их в виде одного строкового значения на выходе.
function main(x) {
return JSON.stringify(x);
}
Запрос Stream Analytics вызывает функцию, как показано в следующем примере.
SELECT
DataString,
DataValue,
HexValue,
UDF.jsonstringify(input) As InputEvent
INTO
output
FROM
input PARTITION BY PARTITIONID
Приведение строки к объекту JSON для обработки
Если у вас есть строковое поле JSON и вы хотите преобразовать его в JSON-объект для обработки в JavaScript UDF, вы можете использовать функцию JSON.parse( ) для создания JSON-объекта, который затем можно использовать. Следующее определение функции анализирует строку и возвращает свойство из полученного объекта.
function main(x) {
var person = JSON.parse(x);
return person.name;
}
Запрос Stream Analytics вызывает функцию, как показано в следующем примере.
SELECT
UDF.getName(input) AS Name
INTO
output
FROM
input
Использование try/catch для обработки ошибок
Блоки try/catch помогут выявить проблемы с искажёнными входными данными, которые вы передаёте в JavaScript UDF. Следующее определение функции использует блок try/catch для обработки ошибок разбора.
function main(input, x) {
var obj = null;
try{
obj = JSON.parse(x);
}catch(error){
throw input;
}
return obj.Value;
}
В следующем примерном запросе вы передаёте всю запись в качестве первого параметра, чтобы функция могла вернуть её в случае ошибки.
SELECT
A.context.company AS Company,
udf.getValue(A, A.context.value) as Value
INTO
output
FROM
input A
toLocaleString()
Метод toLocaleString в JavaScript возвращает строку, чувствительную к языку, которая представляет данные дата-времени с места вызова метода. Хотя Azure Stream Analytics принимает в качестве системной метки времени только дату и время в формате UTC, с помощью этого метода можно преобразовать системную метку времени в другой региональный формат и часовой пояс. Этот метод использует то же поведение реализации, что и в Internet Explorer. Следующее определение функции преобразует входное значение даты и времени в локаль de-DE.
function main(datetime){
const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
return datetime.toLocaleDateString('de-DE', options);
}
В следующем примере запроса в качестве входного значения передаётся datetime.
SELECT
udf.toLocaleString(input.datetime) as localeString
INTO
output
FROM
input
Выход этого запроса — это входная дата времени в de-DE с предоставленными опциями.
Samstag, 28. December 2019
Ведение журнала пользователей
Логирование — это механизм, который Azure Stream Analytics использует для захвата пользовательской информации из пользовательской функции JavaScript во время выполнения задачи. Поскольку выполняющаяся задача в остальном непрозрачна, лог-данные дают вам видимость поведения и корректности вашего пользовательского кода в реальном времени. Каждое лог-сообщение содержит уровень событий, который указывает на значимость сообщения и может ли задание продолжать работу.
Информационные сообщения исходят из метода console.info(), например console.info('my info message');, . Этот уровень записывает общую информацию во время выполнения и не прерывает вычисления. Предупреждающие сообщения поступают из метода console.warn( ), например console.warn('my warning message');. Этот уровень фиксирует данные, которые могут быть неожиданными, но всё же приемлемы для вычислений, поэтому задание продолжает выполняться. Сообщения об ошибках выводятся методами console.error() и console.log(), например console.error('my error message');. Эти методы применяются только в случаях, когда код не может продолжить работу, поэтому они выдают исключение с предоставленной информацией об ошибке и останавливают работу.
Получить доступ к сообщениям журнала можно через диагностические журналы.
atob() и btoa()
Stream Analytics поддерживает два метода конвертации в Base64, что является распространённым способом кодирования бинарных данных в виде текста. Метод btoa() кодирует ASCII-строку в Base64, а метод atob() декодирует строку данных, закодированных Base64, обратно в ASCII-строку. В следующем примере btoa() кодируется ASCII-строка, atob() а затем декодирует результат обратно в исходную строку.
var myAsciiString = 'ascii string';
var encodedString = btoa(myAsciiString);
var decodedString = atob(encodedString);