Движки таблиц Executable
и ExecutablePool
Движки таблиц Executable
и ExecutablePool
позволяют вам определить таблицу, строки которой генерируются из скрипта, который вы определяете (путем записи строк в stdout). Исполняемый скрипт хранится в каталоге users_scripts
и может читать данные из любого источника.
- Таблицы
Executable
: скрипт выполняется при каждом запросе - Таблицы
ExecutablePool
: поддерживают пул постоянных процессов и берут процессы из пула для чтения
Вы можете по желанию включить один или несколько входящих запросов, которые передают свои результаты на stdin для чтения скриптом.
Создание таблицы Executable
Движок таблицы Executable
требует два параметра: имя скрипта и формат входящих данных. Вы можете по желанию передать один или несколько входящих запросов:
Вот соответствующие настройки для таблицы Executable
:
send_chunk_header
- Описание: Отправить количество строк в каждом фрагменте перед отправкой фрагмента на обработку. Эта настройка может помочь вам написать ваш скрипт более эффективно, чтобы заранее выделить некоторые ресурсы.
- Значение по умолчанию: false
command_termination_timeout
- Описание: Тайм-аут завершения команды в секундах
- Значение по умолчанию: 10
command_read_timeout
- Описание: Тайм-аут для чтения данных из stdout команды в миллисекундах
- Значение по умолчанию: 10000
command_write_timeout
- Описание: Тайм-аут для записи данных в stdin команды в миллисекундах
- Значение по умолчанию: 10000
Рассмотрим пример. Следующий Python-скрипт называется my_script.py
и сохранен в папке user_scripts
. Он считывает число i
и выводит i
случайных строк, каждая из которых предшествуется числом, отделенным табуляцией:
Следующая таблица my_executable_table
строится на основе вывода my_script.py
, который будет генерировать 10 случайных строк каждый раз, когда вы выполняете SELECT
из my_executable_table
:
Создание таблицы завершается немедленно и не вызывает скрипт. Запрос к my_executable_table
вызывает выполнение скрипта:
Передача результатов запроса скрипту
Пользователи сайта Hacker News оставляют комментарии. Python содержит набор инструментов для обработки естественного языка (nltk
) с SentimentIntensityAnalyzer
, который определяет, являются ли комментарии положительными, отрицательными или нейтральными, включая присвоение значения от -1 (очень отрицательный комментарий) до 1 (очень положительный комментарий). Давайте создадим таблицу Executable
, которая вычисляет сентимент комментариев Hacker News, используя nltk
.
Этот пример использует таблицу hackernews
, описанную здесь. Таблица hackernews
включает столбец id
типа UInt64
и строковый столбец с именем comment
. Начнем с определения таблицы Executable
:
Некоторые комментарии о таблице sentiment
:
- Файл
sentiment.py
сохранен в папкеuser_scripts
(в папке по умолчанию для настройкиuser_scripts_path
) - Формат
TabSeparated
означает, что наш Python-скрипт должен генерировать строки оригинальных данных, которые содержат табуляцию - Запрос выбирает два столбца из
hackernews
. Скрипту на Python потребуется проанализировать значения этих столбцов из входящих строк
Вот определение sentiment.py
:
Некоторые комментарии о нашем Python-скрипте:
- Для этого вам нужно будет запустить
nltk.downloader.download('vader_lexicon')
. Это можно было бы поместить в скрипт, но тогда он загружался бы каждый раз при выполнении запроса к таблицеsentiment
, что неэффективно - Каждое значение
row
будет строкой в результате набораSELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20
- Входящая строка отделена табуляцией, поэтому мы извлекаем
id
иcomment
с помощью функции Pythonsplit
- Результат
polarity_scores
- это объект JSON с несколькими значениями. Мы решили просто взять значениеcompound
этого JSON-объекта - Напомним, что таблица
sentiment
в ClickHouse использует форматTabSeparated
и содержит два столбца, поэтому наша функцияprint
разделяет эти столбцы табуляцией
Каждый раз, когда вы пишете запрос, который выбирает строки из таблицы sentiment
, выполняется запрос SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20
, и результат передается в sentiment.py
. Давайте протестируем это:
Ответ выглядит следующим образом:
Создание таблицы ExecutablePool
Синтаксис для ExecutablePool
похож на Executable
, но есть несколько важных настроек, уникальных для таблицы ExecutablePool
:
pool_size
- Описание: Размер пула процессов. Если размер равен 0, то ограничения по размеру нет
- Значение по умолчанию: 16
max_command_execution_time
- Описание: Максимальное время выполнения команды в секундах
- Значение по умолчанию: 10
Мы можем легко преобразовать таблицу sentiment
выше, чтобы использовать ExecutablePool
вместо Executable
:
ClickHouse будет поддерживать 4 процесса по запросу, когда ваш клиент запрашивает таблицу sentiment_pooled
.