Введение в UDF#

Пользовательская функция (UDF) — это пользовательская функция, созданная пользователем Trino в клиентском приложении. UDF являются скалярными функциями, возвращающими одно значение, аналогично встроенным функциям.

Note

Пользовательские функции также могут быть написаны на Java и развернуты как плагин. Подробности доступны в руководстве разработчика.

Объявление UDF#

Объявление UDF выполняется с помощью SQL-ключевого слова FUNCTION и поддерживаемых конструкций для SQL пользовательские функции или Python user-defined functions.

UDF может быть объявлена как inline UDF для использования в текущем запросе или как catalog UDF для использования в любых последующих запросах.

Inline пользовательские функции#

Inline пользовательская функция (inline UDF) объявляется и используется в контексте выполнения одного запроса. UDF объявляется в блоке WITH перед запросом:

WITH
  FUNCTION doubleup(x integer)
    RETURNS integer
    RETURN x * 2
SELECT doubleup(21);
-- 42

Inline UDF должны соответствовать правилам именования SQL-идентификаторов и не могут содержать символ ..

Объявление UDF действует только в рамках текущего запроса. Повторное использование функции в последующих запросах невозможно. Если это требуется, используйте catalog UDF.

Несколько inline UDF объявляются через запятую и могут вызывать друг друга, при условии, что вызываемая UDF объявлена до первого использования.

WITH
  FUNCTION doubleup(x integer)
    RETURNS integer
    RETURN x * 2,
  FUNCTION doubleupplusone(x integer)
    RETURNS integer
    RETURN doubleup(x) + 1
SELECT doubleupplusone(21);
-- 43

Обратите внимание, что inline UDF могут переопределять встроенные функции:

WITH
  FUNCTION abs(x integer)
    RETURNS integer
    RETURN x * 2
SELECT abs(-10); -- -20, not 10!

Catalog user-defined functions#

Вы можете сохранять UDF в контексте каталога, если используемый коннектор поддерживает хранение UDF. Следующие коннекторы поддерживают каталожные UDF:

В этом случае доступны следующие команды:

Каталожные UDF должны использовать имя, включающее каталог и схему вместе с именем функции, например example.default.power для UDF power в схеме default каталога example.

Вызов должен использовать полное имя, например example.default.power.

Конфигурация SQL-окружения для UDF#

Настройка sql.default-function-catalog и sql.default-function-schema в SQL environment properties позволяет задать каталог и схему по умолчанию для хранения UDF. Каталог и схема также должны быть добавлены в sql.path. Это позволяет пользователям вызывать UDF и выполнять все операции Управление пользовательскими функциями без указания полного пути к функции.

Note

Используйте Коннектор Memory в каталоге для простого хранения и тестирования ваших UDF.

Рекомендации#

Обработка пользовательских функций (UDF) может быть ресурсоёмкой для кластера с точки зрения памяти и вычислений. При написании и использовании UDF учитывайте следующее:

  • Для контроля поведения запросов (и, соответственно, выполнения UDF) существуют встроенные проверки. Например, если запрос выполняется дольше заданного порога, его выполнение автоматически прерывается.

  • Избегайте создания массивов внутри циклов. На каждой итерации создаётся новый массив с копированием всех элементов, а предыдущий остаётся в памяти до очистки. Вместо этого используйте лямбда-выражения.

  • Избегайте конкатенации строк в циклах. Каждая итерация создаёт новую строку с копированием предыдущей, что увеличивает потребление памяти. Лучше использовать лямбда-выражения.

  • В большинстве случаев UDF следует объявлять с характеристикой RETURNS NULL ON NULL INPUT, если не предусмотрена специальная обработка значений NULL. Это нужно указывать явно, так как по умолчанию используется CALLED ON NULL INPUT.