Пользовательская функция (UDF) Пользовательские функции
- исполняемые пользовательские функции запускают внешнюю программу или скрипт (Python, Bash и т. д.) и потоково передают им блоки данных через STDIN / STDOUT. Используйте их для интеграции существующего кода или инструментов без перекомпиляции ClickHouse. По сравнению с внутрипроцессными вариантами у них выше накладные расходы на каждый вызов, поэтому они лучше подходят для более сложной логики или случаев, когда нужна другая среда выполнения.
- пользовательские функции SQL определяются с помощью
CREATE FUNCTIONисключительно на SQL. Они подставляются/разворачиваются в план запроса (без отдельного процесса), что делает их лёгкими и идеально подходящими для повторного использования логики выражений или упрощения сложных вычисляемых столбцов. - Экспериментальные пользовательские функции WebAssembly выполняют код, скомпилированный в WebAssembly, внутри песочницы в процессе сервера. Они обеспечивают меньшие накладные расходы на каждый вызов, чем внешние исполняемые файлы, и лучшую изоляцию, чем нативные расширения, что делает их подходящими для пользовательских алгоритмов, написанных на языках, которые можно компилировать в WASM (например, C/C++/Rust).
Исполняемые пользовательские функции
Эта возможность доступна в рамках закрытой предварительной версии в ClickHouse Cloud.
Чтобы получить доступ, обратитесь в ClickHouse Support: https://clickhouse.cloud/support.
user_defined_executable_functions_config.
Конфигурация функции включает следующие настройки:
Команда должна читать аргументы из
STDIN и выводить результат в STDOUT. Команда должна обрабатывать аргументы итеративно. То есть после обработки одного фрагмента аргументов она должна ждать следующий.
Исполняемые пользовательские функции
Примеры
UDF из встроенного скрипта
test_function_sum, вручную задав execute_direct значение 0, с помощью конфигурации XML или YAML.
- XML
- YAML
Файл
test_function.xml (/etc/clickhouse-server/test_function.xml при настройках пути по умолчанию)./etc/clickhouse-server/test_function.xml
Query
Result
UDF из скрипта Python
STDIN и возвращает его в виде строки.
Создайте test_function, используя конфигурацию XML или YAML.
- XML
- YAML
Файл
test_function.xml (/etc/clickhouse-server/test_function.xml при использовании путей по умолчанию)./etc/clickhouse-server/test_function.xml
Создайте файл скрипта
test_function.py в папке user_scripts (/var/lib/clickhouse/user_scripts/test_function.py при использовании путей по умолчанию).
Query
Result
Прочитайте два значения из STDIN и верните их сумму в виде объекта JSON
test_function_sum_json с именованными аргументами и форматом JSONEachRow, используя конфигурацию в XML или YAML.
- XML
- YAML
Файл
test_function.xml (/etc/clickhouse-server/test_function.xml при настройках путей по умолчанию)./etc/clickhouse-server/test_function.xml
Создайте файл скрипта
test_function_sum_json.py в папке user_scripts (/var/lib/clickhouse/user_scripts/test_function_sum_json.py при настройках путей по умолчанию).
Query
Result
Использование параметров в настройке command
executable могут принимать константные параметры, заданные в настройке command (это работает только для пользовательских функций типа executable).
Также требуется параметр execute_direct, чтобы исключить уязвимость, связанную с подстановкой аргументов командной оболочкой.
- XML
- YAML
Файл
test_function_parameter_python.xml (/etc/clickhouse-server/test_function_parameter_python.xml, если используются пути по умолчанию)./etc/clickhouse-server/test_function_parameter_python.xml
Создайте файл скрипта
test_function_parameter_python.py в каталоге user_scripts (/var/lib/clickhouse/user_scripts/test_function_parameter_python.py, если используются пути по умолчанию).
Query
Result
UDF из shell-скрипта
- XML
- YAML
Файл
test_function_shell.xml (/etc/clickhouse-server/test_function_shell.xml при пути по умолчанию)./etc/clickhouse-server/test_function_shell.xml
Создайте файл скрипта
test_shell.sh в папке user_scripts (/var/lib/clickhouse/user_scripts/test_shell.sh при пути по умолчанию).
/var/lib/clickhouse/user_scripts/test_shell.sh
Query
Result
Обработка ошибок
Вычисление выражений аргументов
&&, || и ?:.
В ClickHouse аргументы функций (операторов) вычисляются всегда.
Это связано с тем, что вычисляются сразу целые части столбцов, а не каждая строка отдельно.
Выполнение функций при распределённой обработке запросов
SELECT f(sum(g(x))) FROM distributed_table GROUP BY h(y),
- если
distributed_tableсодержит как минимум два сегмента, функции ‘g’ и ‘h’ выполняются на удалённых серверах, а функция ‘f’ — на сервере-инициаторе запроса. - если
distributed_tableсодержит только один сегмент, все функции ‘f’, ‘g’ и ‘h’ выполняются на сервере этого сегмента.
hostName, которая возвращает имя сервера, на котором она выполняется, чтобы можно было использовать GROUP BY по серверам в запросе SELECT.
Если функция в запросе выполняется на сервере-инициаторе запроса, но её нужно выполнить на удалённых серверах, можно обернуть её в агрегатную функцию ‘any’ или добавить в ключ GROUP BY.