Перейти к основному содержимому
Перейти к основному содержимому

Пользовательские функции в Cloud

Пользовательские функции (UDF) позволяют пользователям расширять возможности ClickHouse сверх того, что доступно в более чем тысяче готовых functions.

В ClickHouse Cloud есть два способа создать пользовательские функции:

  1. С помощью SQL
  2. С помощью UI и собственного кода (закрытая предварительная версия)

Пользовательские функции SQL

UDF в SQL можно создавать из лямбда-выражений с помощью команды CREATE FUNCTION.

В этом примере мы создадим простую исполняемую пользовательскую функцию isBusinessHours. Функция будет проверять, попадает ли указанная метка времени в стандартные рабочие часы, и возвращать true, если попадает, и false в противном случае.

  1. Войдите в Cloud Console и откройте SQL-консоль
  2. Напишите следующий SQL-запрос, чтобы создать функцию isBusinessHours:
CREATE FUNCTION isBusinessHours AS (ts) ->
toDayOfWeek(ts) BETWEEN 1 AND 5
AND toHour(ts) BETWEEN 9 AND 17;
  1. Выполните следующую команду, чтобы протестировать только что созданную UDF:
SELECT isBusinessHours('2026-03-20 10:00:00'::DateTime), isBusinessHours('2026-03-20 23:00:00'::DateTime);

Должен получиться следующий результат:

1   0
  1. Вы можете использовать команду DROP FUNCTION, чтобы удалить только что созданную UDF:
DROP FUNCTION isBusinessHours
Важно

UDF в ClickHouse Cloud не наследуют пользовательские настройки. Они выполняются с системными настройками по умолчанию.

Это означает:

  • Настройки уровня сессии (задаются командой SET) не передаются в контекст выполнения UDF
  • UDF не наследуют настройки профиля пользователя
  • Настройки уровня запроса не применяются при выполнении UDF

Пользовательские функции, созданные через интерфейс

Private preview

ClickHouse Cloud предлагает возможность создавать пользовательские функции через интерфейс.

Примечание

Если вы хотите опробовать эту функцию, свяжитесь со службой поддержки, чтобы получить доступ к закрытой предварительной версии.

В этом примере мы создадим ту же простую исполняемую пользовательскую функцию isBusinessHours, которая проверяет, попадает ли определённый таймстамп в обычные рабочие часы. Ранее мы создавали её с помощью SQL, но на этот раз создадим её с помощью Python и настроим через интерфейс.

Создайте файл Python

Создайте новый локальный файл main.py:

cat > main.py << 'EOF'
import sys
from datetime import datetime

for line in sys.stdin:
    ts = datetime.fromisoformat(line.strip())
    result = 1 if (0 <= ts.weekday() <= 4 and 9 <= ts.hour <= 17) else 0
    print(result)
    sys.stdout.flush()
EOF

Теперь сожмите файл в ZIP-архив:

zip is_business_hours.zip main.py
Примечание

ClickHouse Cloud ожидает, что в zip-файле, который вы загрузите через интерфейс на следующем шаге, будет находиться main.py. Если вы назовёте файл иначе, возникнет ошибка.

Создайте UDF через интерфейс

  1. На главной странице консоли Cloud нажмите название своей организации в меню в левом нижнем углу.
  2. Выберите в меню Пользовательские функции.
  3. На странице пользовательских функций нажмите Set up a UDF. Справа на экране откроется панель настройки.
  4. Введите имя функции. В этом примере используйте isBusinessHours.
  5. Выберите тип функции: Executable pool или Executable:
    • Executable pool: Поддерживается пул постоянных процессов, и для операций чтения из пула берётся процесс.
    • Executable: Скрипт выполняется при каждом запросе.
  6. В этом примере используйте настройки по умолчанию. Полный список параметров настройки см. в разделе Executable user-defined functions.
  7. Нажмите Browse File, чтобы загрузить файл .zip, созданный в начале этого руководства.
  8. Добавьте новый аргумент. В этом примере добавьте аргумент timestamp с типом DateTime.
  9. Выберите тип возвращаемого значения. В этом примере выберите Bool.
  10. Нажмите Create UDF. В диалоговом окне отображается текущий статус сборки.
    • Если возникнут какие-либо проблемы, статус изменится на error.
    • В противном случае статус меняется с building на provisioning. Чтобы завершить provisioning, ваш сервис должен быть активен. Если сервис бездействует, нажмите Wake Up Service на панели UDF details рядом с именем сервиса.
    • После завершения статус изменится на deployed.

Протестируйте свой UDF

  1. Вернитесь на главную страницу SQL Console, нажав Settings - return to your service view в левом верхнем углу страницы.
  2. Нажмите SQL Console в меню слева.
  3. Выполните следующий запрос:
SELECT isBusinessHours('2026-03-20 10:00:00'::DateTime), isBusinessHours('2026-03-20 23:00:00'::DateTime);

Вы должны увидеть результат:

true    false

Создайте новую версию

  1. На главной странице консоли Cloud нажмите название своей организации в меню в левом нижнем углу.
  2. Выберите в меню Пользовательские функции.
  3. Для UDF isBusinessHours нажмите на три точки в разделе Actions, затем нажмите Create new version
  4. Загрузите zip-файл с изменённым кодом или измените настройки, а затем нажмите Create new version

Вы успешно добавили свою первую пользовательскую функцию через интерфейс, убедились, что она работает, и увидели, как при необходимости создать её новую версию.