Пользовательские функции в 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
Пользовательские функции, созданные через интерфейс
ClickHouse Cloud предлагает возможность создавать пользовательские функции через интерфейс.
Если вы хотите опробовать эту функцию, свяжитесь со службой поддержки, чтобы получить доступ к закрытой предварительной версии.
В этом примере мы создадим ту же простую исполняемую пользовательскую функцию isBusinessHours, которая проверяет, попадает ли определённый таймстамп в обычные рабочие часы.
Ранее мы создавали её с помощью SQL, но на этот раз создадим её с помощью Python и настроим через интерфейс.
Создайте файл Python
Создайте новый локальный файл main.py:
Теперь сожмите файл в ZIP-архив:
ClickHouse Cloud ожидает, что в zip-файле, который вы загрузите через интерфейс на следующем шаге, будет находиться main.py.
Если вы назовёте файл иначе, возникнет ошибка.
Создайте 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 нажмите название своей организации в меню в левом нижнем углу.
- Выберите в меню Пользовательские функции.
- Для UDF
isBusinessHoursнажмите на три точки в разделе Actions, затем нажмите Create new version - Загрузите zip-файл с изменённым кодом или измените настройки, а затем нажмите Create new version
Вы успешно добавили свою первую пользовательскую функцию через интерфейс, убедились, что она работает, и увидели, как при необходимости создать её новую версию.