Пользовательские статистические выражения JavaScript в Azure Stream Analytics
Azure Stream Analytics поддерживает пользовательские статистические выражения (UDA) на языке JavaScript, что позволяет реализовывать сложную бизнес-логику с отслеживанием состояния. Внутри пользовательского статистического выражения предоставляется полный контроль над структурой данных состояния, накоплением состояния, сокращением состояния и вычислением статистических результатов. В этой статье представлены два разных интерфейса пользовательских статистических выражений (UDA) JavaScript, а также инструкции по созданию пользовательского статистического выражения и способы его использования в операциях на основе окна в запросе Stream Analytics.
Пользовательские статистические выражения JavaScript
Пользовательское статистическое выражение используется в указанном временном окне для выполнения статистического вычисления и создания одиночного результирующего значения. Существуют два типа интерфейсов UDA, поддерживаемых Stream Analytics в настоящее: AccumulateOnly и AccumulateDeaccumulate. Оба типа пользовательских статистических выражений можно использовать для "переворачивающегося", "прыгающего", скользящего окна и окна сеанса. Пользовательское статистическое выражение AccumulateDeaccumulate работает быстрее, чем AccumulateOnly, при использовании с "прыгающим", скользящим окном или окном сеанса. Можно выбрать один из двух типов в зависимости от используемого алгоритма.
Статистические выражения AccumulateOnly
Статистические выражения AccumulateOnly могут накапливать только новые события в своем состоянии, их алгоритм не допускает удаления значений. Выберите этот тип статистического выражения, если удаление данных события из значения состояния невозможно реализовать. Ниже приведен шаблон JavaScript для статистических выражений AccumulatOnly.
// Sample UDA which state can only be accumulated.
function main() {
this.init = function () {
this.state = 0;
}
this.accumulate = function (value, timestamp) {
this.state += value;
}
this.computeResult = function () {
return this.state;
}
}
Статистические выражения AccumulateDeaccumulate
Статистические выражения AccumulateDeaccumulate допускают удаление накопленного ранее значения из состояния, например удаление пары "ключ-значение" из списка значений события, или вычитание значения из состояния статистического выражения суммирования. Ниже приведен шаблон JavaScript для статистических выражений AccumulateDeaccumulate.
// Sample UDA which state can be accumulated and deaccumulated.
function main() {
this.init = function () {
this.state = 0;
}
this.accumulate = function (value, timestamp) {
this.state += value;
}
this.deaccumulate = function (value, timestamp) {
this.state -= value;
}
this.deaccumulateState = function (otherState){
this.state -= otherState.state;
}
this.computeResult = function () {
return this.state;
}
}
Пользовательское статистическое выражение: объявление функции JavaScript
Каждое пользовательское статистическое выражение JavaScript определяется в объявлении объекта функции. Ниже приведены основные элементы в определении пользовательского статистического выражения.
Псевдоним функции
Псевдоним функции — это идентификатор пользовательского статистического выражения. При вызове в запросе Stream Analytics всегда используйте псевдоним UDA вместе с префиксом "uda".
Тип функции *
Для пользовательского статистического выражения должен быть указан тип функции Javascript UDA.
Тип выходных данных
Определенный тип заданий, поддерживаемый Stream Analytics, или "Любой", если требуется обрабатывать тип в запросе.
Имя функции
Имя этого объекта функции. Имя функции должно соответствовать псевдониму пользовательского статистического выражения.
Метод init()
Метод init() инициализирует состояние статистического выражения. Этот метод вызывается в начале окна.
Метод accumulate()
Метод accumulate() определяет состояние пользовательского статистического выражения на основе значений предыдущего состояния и текущего события. Этот метод вызывается, когда событие попадает во временное окно (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW или SESSIONWINDOW).
Метод deaccumulate()
Метод deaccumulate() повторно определяет состояние на основе значений предыдущего состояния и текущего события. Этот метод вызывается, когда событие покидает окно SLIDINGWINDOW или SESSIONWINDOW.
Метод deaccumulateState()
Метод deaccumulateState() повторно определяет состояние на основе предыдущего состояния и состояния перехода. Этот метод вызывается, когда набор событий покидает окно HOPPINGWINDOW.
Метод computeResult()
Метод computeResult() возвращает результат статистического выражения на основе текущего состояния. Этот метод вызывается в конце временного окна (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW или SESSIONWINDOW).
Поддерживаемые типы входных и выходных данных для пользовательских статистических выражений JavaScript
Типы данных для пользовательских статистических выражений JavaScript приведены в разделе Преобразование типов Stream Analytics и JavaScript статьи Определяемые пользователем функции JavaScript в Azure Stream Analytics.
Добавление пользовательского статистического выражения JavaScript на портале Azure
Ниже рассматривается процесс создания пользовательского статистического выражения на портале. В примере, который здесь используется, вычисляются средневзвешенные по времени значения.
Теперь создадим пользовательское статистическое выражение JavaScript в существующем задании ASA, выполнив приведенные инструкции.
Выполните вход на портал Azure и найдите задание Stream Analytics.
Щелкните ссылку "Функции" в разделе Топология задания.
Нажмите кнопку Добавить для добавления новой функции.
В представлении "Новая функция" выберите тип функции JavaScript UDA. В редакторе отобразится шаблон пользовательского статистического выражения по умолчанию.
Введите "TWA" в качестве псевдонима пользовательского статистического выражения и измените реализацию функции, как показано ниже.
// Sample UDA which calculate Time-Weighted Average of incoming values. function main() { this.init = function () { this.totalValue = 0.0; this.totalWeight = 0.0; } this.accumulate = function (value, timestamp) { this.totalValue += value.level * value.weight; this.totalWeight += value.weight; } // Uncomment below for AccumulateDeaccumulate implementation /* this.deaccumulate = function (value, timestamp) { this.totalValue -= value.level * value.weight; this.totalWeight -= value.weight; } this.deaccumulateState = function (otherState){ this.state -= otherState.state; this.totalValue -= otherState.totalValue; this.totalWeight -= otherState.totalWeight; } */ this.computeResult = function () { if(this.totalValue == 0) { result = 0; } else { result = this.totalValue/this.totalWeight; } return result; } }
Щелкните "Сохранить", и пользовательское статистическое выражение (UDA) появится в списке функций.
Выберите новую функцию TWA, и вы сможете проверить ее определение.
Вызов пользовательского статистического выражения JavaScript в запросе ASA
На портале Azure откройте задание, измените запрос и вызовите функцию TWA() с обязательным префиксом "uda". Например:
WITH value AS
(
SELECT
NoiseLevelDB as level,
DurationSecond as weight
FROM
[YourInputAlias] TIMESTAMP BY EntryTime
)
SELECT
System.Timestamp as ts,
uda.TWA(value) as NoseDoseTWA
FROM value
GROUP BY TumblingWindow(minute, 5)
Проверка запроса с пользовательским статистическим выражением
Создайте локальный JSON-файл с приведенным ниже содержимым, передайте его в задание Stream Analytics и проверьте приведенный выше запрос.
[
{"EntryTime": "2017-06-10T05:01:00-07:00", "NoiseLevelDB": 80, "DurationSecond": 22.0},
{"EntryTime": "2017-06-10T05:02:00-07:00", "NoiseLevelDB": 81, "DurationSecond": 37.8},
{"EntryTime": "2017-06-10T05:02:00-07:00", "NoiseLevelDB": 85, "DurationSecond": 26.3},
{"EntryTime": "2017-06-10T05:03:00-07:00", "NoiseLevelDB": 95, "DurationSecond": 13.7},
{"EntryTime": "2017-06-10T05:03:00-07:00", "NoiseLevelDB": 88, "DurationSecond": 10.3},
{"EntryTime": "2017-06-10T05:05:00-07:00", "NoiseLevelDB": 103, "DurationSecond": 5.5},
{"EntryTime": "2017-06-10T05:06:00-07:00", "NoiseLevelDB": 99, "DurationSecond": 23.0},
{"EntryTime": "2017-06-10T05:07:00-07:00", "NoiseLevelDB": 108, "DurationSecond": 1.76},
{"EntryTime": "2017-06-10T05:07:00-07:00", "NoiseLevelDB": 79, "DurationSecond": 17.9},
{"EntryTime": "2017-06-10T05:08:00-07:00", "NoiseLevelDB": 83, "DurationSecond": 27.1},
{"EntryTime": "2017-06-10T05:09:00-07:00", "NoiseLevelDB": 91, "DurationSecond": 17.1},
{"EntryTime": "2017-06-10T05:09:00-07:00", "NoiseLevelDB": 115, "DurationSecond": 7.9},
{"EntryTime": "2017-06-10T05:09:00-07:00", "NoiseLevelDB": 80, "DurationSecond": 28.3},
{"EntryTime": "2017-06-10T05:10:00-07:00", "NoiseLevelDB": 55, "DurationSecond": 18.2},
{"EntryTime": "2017-06-10T05:10:00-07:00", "NoiseLevelDB": 93, "DurationSecond": 25.8},
{"EntryTime": "2017-06-10T05:11:00-07:00", "NoiseLevelDB": 83, "DurationSecond": 11.4},
{"EntryTime": "2017-06-10T05:12:00-07:00", "NoiseLevelDB": 89, "DurationSecond": 7.9},
{"EntryTime": "2017-06-10T05:15:00-07:00", "NoiseLevelDB": 112, "DurationSecond": 3.7},
{"EntryTime": "2017-06-10T05:15:00-07:00", "NoiseLevelDB": 93, "DurationSecond": 9.7},
{"EntryTime": "2017-06-10T05:18:00-07:00", "NoiseLevelDB": 96, "DurationSecond": 3.7},
{"EntryTime": "2017-06-10T05:20:00-07:00", "NoiseLevelDB": 108, "DurationSecond": 0.99},
{"EntryTime": "2017-06-10T05:20:00-07:00", "NoiseLevelDB": 113, "DurationSecond": 25.1},
{"EntryTime": "2017-06-10T05:22:00-07:00", "NoiseLevelDB": 110, "DurationSecond": 5.3}
]
Получить помощь
Для получения дополнительной помощи воспользуйтесь страницей вопросов и ответов о Microsoft Azure Stream Analytics.
Следующие шаги
- Введение в Azure Stream Analytics
- Приступая к работе с Azure Stream Analytics
- Масштабирование заданий в службе Azure Stream Analytics
- Azure Stream Analytics query language reference (Справочник по языку запросов Azure Stream Analytics).
- Azure Stream Analytics management REST API reference (Справочник по API-интерфейсу REST для управления Stream Analytics).