Введение в 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:
В этом случае доступны следующие команды:
CREATE FUNCTION — создать и сохранить UDF
DROP FUNCTION — удалить UDF
SHOW FUNCTIONS — показать список 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.