Python user-defined functions#
Python пользовательская функция (UDF) — это пользовательская функция, которая использует язык программирования Python и его конструкции для определения функции.
Объявление Python UDF#
Объявите Python UDF как inline или catalog UDF, выполнив следующие шаги:
Используйте ключевое слово FUNCTION для объявления имени функции и параметров.
Добавьте объявление
RETURNS, чтобы указать тип возвращаемого значения.Установите
LANGUAGEвPYTHON.Укажите имя вызываемой Python-функции через свойство
handlerв блокеWITH.Используйте
$$, чтобы заключить Python-код после ключевого словаAS.Добавьте функцию, указанную в
handler, и убедитесь, что она возвращает объявленный тип данных.Расширьте блок Python-кода, реализовав функцию с использованием доступных возможностей языка Python.
Следующий фрагмент показывает псевдокод:
FUNCTION python_udf_name(input_parameter data_type)
RETURNS result_data_type
LANGUAGE PYTHON
WITH (handler = 'python_function')
AS $$
...
def python_function(input):
return ...
...
$$
Минимальный пример объявляет UDF doubleup, которая возвращает входное целое значение x,
умноженное на два. Пример демонстрирует объявление как Inline пользовательские функции и вызов с значением 21,
что даёт результат 42.
Установите язык PYTHON, чтобы переопределить значение по умолчанию SQL для SQL пользовательские функции.
Python-код заключается в $$ и должен иметь корректное форматирование.
WITH
FUNCTION doubleup(x integer)
RETURNS integer
LANGUAGE PYTHON
WITH (handler = 'twice')
AS $$
def twice(a):
return a * 2
$$
SELECT doubleup(21);
-- 42
Та же UDF может быть объявлена как Catalog user-defined functions.
Обратитесь к Example Python UDFs для более сложных примеров и сценариев использования.
Особенности языка Python#
Интеграция Python UDF в Trino использует Python 3.13.0 в изолированной среде (sandbox). Код Python выполняется внутри среды выполнения WebAssembly (WASM) в виртуальной машине Java, в которой работает Trino.
Необходимо соблюдать правила языка Python, включая отступы.
Python UDF имеют доступ только к языку Python и базовым библиотекам, включённым в изолированную среду выполнения. Доступ к внешним ресурсам (сеть, файловая система) не поддерживается. Использование сторонних библиотек Python, инструментов командной строки и менеджеров пакетов также не поддерживается.
Следующие библиотеки явно удалены из среды выполнения и недоступны в Python UDF:
bdbconcurrentcursesensurepipdoctestidlelibmultiprocessingpdbpydocsocketserversqlite3sslsubprocesstkinterturtleunittestvenvwebbrowserwsgirefxmlrpc
Следующие библиотеки явно добавлены в среду выполнения и доступны в Python UDF:
attrsbleachcharset-normalizerdefusedxmlidnajmespathjsonschemapyasn1pyparsingpython-dateutilrsatomliua-parser
Type mapping (Сопоставление типов)#
В следующей таблице показаны поддерживаемые типы Trino и соответствующие им типы Python для входных и выходных значений Python UDF:
Trino type |
Python type |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Время и временные метки#
Объекты Python datetime и time поддерживают точность только до микросекунд.
Значения Trino с большей точностью округляются при преобразовании в Python,
а возвращаемые из Python значения округляются, если тип Trino имеет меньшую точность.
Временные метки с часовым поясом#
Поддерживаются только часовые пояса с фиксированным смещением. Временные метки с политическими часовыми поясами преобразуются в смещение, соответствующее моменту времени.