Исполняемые и ИсполняемыеПулы Табличные Движки
Движки таблиц Executable
и ExecutablePool
позволяют вам определить таблицу, строки которой генерируются из скрипта, который вы определяете (путем записи строк в stdout). Исполняемый скрипт сохраняется в директории users_scripts
и может считывать данные из любого источника.
- Таблицы
Executable
: скрипт выполняется при каждом запросе - Таблицы
ExecutablePool
: поддерживают пул постоянных процессов и берут процессы из пула для чтения
Вы можете дополнительно включить один или несколько входящих запросов, которые передают свои результаты в stdin для считывания скриптом.
Создание Исполняемой Таблицы
Движок таблицы 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
и колонку String
с именем 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
, используя функциюsplit
на Python - Результат
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
аналогичен Executable
, но есть несколько соответствующих настроек, уникальных для таблицы ExecutablePool
:
pool_size
- Описание: Размер пула процессов. Если размер равен 0, то размерных ограничений нет.
- Значение по умолчанию: 16
max_command_execution_time
- Описание: Максимальное время выполнения команды в секундах
- Значение по умолчанию: 10
Мы можем легко преобразовать таблицу sentiment
выше, чтобы использовать ExecutablePool
вместо Executable
:
ClickHouse будет поддерживать 4 процесса по запросу, когда ваш клиент запрашивает таблицу sentiment_pooled
.