Пользовательская функция для расчета всех событий в окне Esper - PullRequest
0 голосов
/ 12 февраля 2020

Мне интересно, какой самый лучший или самый идиоматический c способ предоставить все события в окне пользовательской функции. Следующий пример построен на основе примеров стилей цен акций, используемых в онлайн-документации Esper.


Предположим, у нас есть следующий запрос Esper:

select avg(price), custom_function(price) from OrderEvent#unique(symbol)

Возвращает часть avg(price) среднее значение самой последней цены для каждого символа. Предположим, что мы хотим, чтобы custom_function работал аналогичным образом, но для этого нужны сложные логики c - он хотел бы перебирать каждое значение в окне каждый раз, когда требуется результат (например, методы обнаружения выбросов могут нуждаться в таком алгоритме) .

Чтобы было ясно, я требую, чтобы алгоритм выглядел примерно так:

custom_function(window):
   for each event in window:
       update calculation

, и не существует разумного способа обновить вычисления, когда события входят или выходят из окна.


Настраиваемая агрегация может достичь этого путем отправки и переноса событий в набор, но это становится проблематичным c при использовании примитивных типов. Это также кажется расточительным, так как предположительно esper уже имеет коллекцию событий в окне, поэтому мы предпочитаем не дублировать это.

В документах Esper упоминается много способов настройки, см. этот шаблон решения, например. Также упоминается, что «pull API» может повторять все события в окне.


Какие подходы считаются лучшими для решения проблемы такого типа?

1 Ответ

0 голосов
/ 12 февраля 2020

Для доступа ко всем событиям одновременно используйте window(*) или prevwindow(*).

select MyLibrary.computeSomething(window(*)) from ...

computeSomething - это метод c stati c класса MyLibrary (или определить UDF).

Для доступа к отдельным событиям за раз вы можете использовать метод перечисления. Агрегат-метод имеет начальное значение и лямбда-накопитель. Существует расширение API для расширения существующих методов перечисления, которые вы также можете использовать.

select window(*).aggregate(..., (value, eventitem) => ...) from ...

ссылка на окно (*) do c и ссылка на метод enum агрегат do c и ссылка на расширение метода enum api do c

...