табличная функция executable для UDF
Табличная функция executable создаёт таблицу на основе вывода пользовательской функции (UDF), которую вы определяете в скрипте, выводящем строки в stdout. Исполняемый скрипт хранится в директории users_scripts и может читать данные из любого источника. Убедитесь, что на вашем сервере ClickHouse установлены все необходимые пакеты для запуска исполняемого скрипта. Например, если это скрипт на Python, убедитесь, что на сервере установлены необходимые пакеты Python.
При необходимости вы можете указать один или несколько входных запросов, которые будут передавать свои результаты в stdin, чтобы скрипт мог их читать.
Ключевое преимущество по сравнению с обычными UDF-функциями у табличной функции executable и движка таблицы Executable заключается в том, что обычные UDF-функции не могут изменять количество строк. Например, если на вход подаётся 100 строк, то результат также должен содержать 100 строк. При использовании табличной функции executable или движка таблицы Executable ваш скрипт может выполнять любые необходимые преобразования данных, включая сложные агрегации.
Синтаксис
Табличная функция executable принимает три обязательных параметра и необязательный список входных запросов:
script_name: имя файла скрипта, который сохраняется в папкеuser_scripts(папка по умолчанию для настройкиuser_scripts_path)format: формат создаваемой таблицыstructure: схема создаваемой таблицыinput_query: необязательный запрос (или набор запросов), результаты которого передаются в скрипт через stdin
Если вы собираетесь вызывать один и тот же скрипт многократно с одинаковыми входными запросами, рассмотрите возможность использования движка таблиц Executable.
Следующий скрипт Python называется generate_random.py и сохраняется в папке user_scripts. Он читает число i и выводит i случайных строк, при этом каждая строка предваряется числом, отделённым табуляцией:
Давайте запустим скрипт и попросим его сгенерировать 10 случайных строк:
Ответ будет выглядеть следующим образом:
Настройки
send_chunk_header— управляет тем, нужно ли отправлять количество строк перед отправкой блока данных на обработку. Значение по умолчанию —false.pool_size— размер пула. Если в качествеpool_sizeуказано 0, то ограничения на размер пула отсутствуют. Значение по умолчанию —16.max_command_execution_time— максимальное время выполнения команды скрипта при обработке блока данных. Задаётся в секундах. Значение по умолчанию — 10.command_termination_timeout— исполняемый скрипт должен содержать основной цикл чтения/записи. После того как табличная функция уничтожается, канал (pipe) закрывается, и у исполняемого файла естьcommand_termination_timeoutсекунд на завершение работы, прежде чем ClickHouse отправит сигнал SIGTERM дочернему процессу. Задаётся в секундах. Значение по умолчанию — 10.command_read_timeout— таймаут чтения данных из stdout команды в миллисекундах. Значение по умолчанию — 10000.command_write_timeout— таймаут записи данных в stdin команды в миллисекундах. Значение по умолчанию — 10000.
Передача результатов запроса в скрипт
Обязательно ознакомьтесь с примером в табличном движке Executable о том, как передать результаты запроса в скрипт. Ниже показано, как выполнить тот же скрипт из этого примера с помощью табличной функции executable: