Flink: Каковы лучшие альтернативы использованию UDF Python в MATCH_RECOGNIZE?

Когда я пытаюсь использовать MATCH_RECOGNIZE в своих SQL-запросах с UDFPython, я получаю сообщение об ошибке Python Function can not be used in MATCH_RECOGNIZE for now.

Например, не поддерживается следующее:

      SELECT T.aa as ta
FROM MyTable
MATCH_RECOGNIZE (
  ORDER BY proctime
  MEASURES
    A.a as aa,
    pyFunc(1,2) as bb
  PATTERN (A B)
  DEFINE
    A AS a = 1,
    B AS b = 'b'
) AS T

Это вызывает несколько вопросов:

  1. Почему планировщику Blink требуется поддержка функций Python?

  2. Где я могу найти в документации такое отсутствие поддержки? В документации по этой функции не упоминается Python. Ожидается ли, что я выполню синтаксический разбор проверочных тестов ?

  3. (основной вопрос) Является ли лучшей альтернативой MATCH_RECOGNIZE функция Python для агрегирования таблиц, определяемая пользователем? Я хочу найти последовательно только два события (в пределах часового окна). Я знаю, что могу сделать это с помощью самостоятельного присоединения, но я хотел бы посмотреть, есть ли более эффективная / чистая возможность.

1 ответ

В качестве обходного пути для невозможности использовать UDF Python в предложении меры кажется, что вы могли бы создать в качестве вывода из MATCH_RECOGNIZE данные, необходимые в качестве входных данных для UDF, а затем применить UDF на следующем шаге.

Что-то вроде этого:

      SELECT
  T.aa AS ta, 
  pyFunc(T.one, T.two) AS tb
FROM MyTable
MATCH_RECOGNIZE (
  ORDER BY proctime
  MEASURES
    A.a AS aa,
    1 AS one,
    2 AS two
  PATTERN (A B)
  DEFINE
    A AS a = 1,
    B AS b = 'b'
) AS T

Использование самосоединения с ограничением интервала для атрибутов времени должно дать эффективный план, если вы решите использовать этот подход вместо этого.

Другие вопросы по тегам