Пользовательские функции в Cloud
Пользовательские функции (UDF) позволяют пользователям расширять возможности ClickHouse сверх того, что доступно в более чем тысяче готовых functions.
В ClickHouse Cloud есть два способа создать пользовательские функции:
- С помощью SQL
- С помощью UI и собственного кода (закрытая предварительная версия)
Пользовательские функции SQL
UDF в SQL можно создавать из лямбда-выражений с помощью команды CREATE FUNCTION.
В этом примере мы создадим простую исполняемую пользовательскую функцию isBusinessHours.
Функция будет проверять, попадает ли указанная метка времени в стандартные рабочие часы, и возвращать true, если попадает, и false в противном случае.
- Войдите в Cloud Console и откройте SQL-консоль
- Напишите следующий SQL-запрос, чтобы создать функцию
isBusinessHours:
- Выполните следующую команду, чтобы протестировать только что созданную UDF:
Должен получиться следующий результат:
- Вы можете использовать команду
DROP FUNCTION, чтобы удалить только что созданную UDF:
UDF в ClickHouse Cloud не наследуют пользовательские настройки. Они выполняются с системными настройками по умолчанию.
Это означает:
- Настройки уровня сессии (задаются командой
SET) не передаются в контекст выполнения UDF - UDF не наследуют настройки профиля пользователя
- Настройки уровня запроса не применяются при выполнении UDF
Пользовательские функции, созданные через UI
ClickHouse Cloud предлагает интерфейс UI для создания пользовательских функций.
Если вы хотите попробовать эту возможность, обратитесь в службу поддержки, чтобы получить доступ к закрытой предварительной версии.
В этом примере мы создадим ту же простую исполняемую пользовательскую функцию isBusinessHours, которая проверяет, попадает ли заданная временная метка в диапазон обычных рабочих часов.
Ранее мы создавали её с помощью SQL, но на этот раз создадим её с помощью Python и настроим через UI.
Создайте файл Python
Создайте новый файл main.py на локальной машине:
Теперь упакуйте файл в ZIP-архив:
Создайте UDF через интерфейс
- На главной странице консоли Cloud нажмите название своей организации в меню в левом нижнем углу.
- Выберите в меню Пользовательские функции.
- На странице пользовательских функций нажмите Set up a UDF. Справа на экране откроется панель настройки.
- Введите имя функции. В этом примере используйте
isBusinessHours. - Выберите тип функции: Executable pool или Executable:
- Executable pool: Поддерживается пул постоянных процессов, и для операций чтения из пула берётся процесс.
- Executable: Скрипт выполняется при каждом запросе.
- В этом примере используйте настройки по умолчанию. Полный список параметров настройки см. в разделе Executable user-defined functions.
- Нажмите Browse File, чтобы загрузить файл
.zip, созданный в начале этого руководства. - Добавьте новый аргумент. В этом примере добавьте аргумент
timestampс типомDateTime. - Выберите тип возвращаемого значения. В этом примере выберите
Bool. - Нажмите Create UDF. В диалоговом окне отображается текущий статус сборки.
- Если возникнут какие-либо проблемы, статус изменится на error.
- В противном случае статус меняется с building на provisioning. Чтобы завершить provisioning, ваш сервис должен быть активен. Если сервис бездействует, нажмите Wake Up Service на панели UDF details рядом с именем сервиса.
- После завершения статус изменится на deployed.
Протестируйте свою UDF
- вернитесь на главную страницу SQL Console, нажав Settings - return to your service view в левом верхнем углу страницы
- нажмите SQL Console в меню слева
- введите следующий запрос:
Вы должны увидеть следующий результат:
Создать новую версию
- На главной странице консоли Cloud нажмите имя своей организации в меню в левом нижнем углу.
- В меню выберите User-defined functions.
- Для UDF
isBusinessHoursнажмите на три точки в столбце Actions, затем выберите создать новую версию - Загрузите zip-архив с изменённым кодом или измените настройки, затем нажмите создать новую версию
Вы успешно добавили свою первую пользовательскую функцию через UI, убедились, что она работает, и увидели, как при необходимости создать для неё новую версию.