Executable и ExecutablePool позволяют определить таблицу, строки которой генерируются заданным вами скриптом (путём записи строк в stdout). Исполняемый скрипт хранится в каталоге users_scripts и может читать данные из любого источника.
- Таблицы
Executable: скрипт запускается при каждом запросе - Таблицы
ExecutablePool: поддерживают пул постоянных процессов и используют процессы из этого пула для чтения
Создание таблицы Executable
Executable требуются два параметра: имя скрипта и формат входных данных. При необходимости можно также передать один или несколько входных запросов:
Executable:
send_chunk_header- Описание: отправляет количество строк в каждом фрагменте перед передачей фрагмента на обработку. Эта настройка позволяет писать скрипт эффективнее, заранее выделяя некоторые ресурсы
- Значение по умолчанию: false
command_termination_timeout- Описание: тайм-аут завершения команды в секундах
- Значение по умолчанию: 10
command_read_timeout- Описание: тайм-аут чтения данных из stdout команды в миллисекундах
- Значение по умолчанию: 10000
command_write_timeout- Описание: тайм-аут записи данных в stdin команды в миллисекундах
- Значение по умолчанию: 10000
my_script.py и сохранён в папке user_scripts. Он считывает число i и выводит i случайных строк, причём перед каждой строкой выводится число, отделённое символом табуляции:
my_executable_table строится на основе вывода my_script.py, который генерирует 10 случайных строк каждый раз, когда вы выполняете SELECT из my_executable_table:
my_executable_table скрипт вызывается:
Передача результатов запроса в скрипт
nltk) с SentimentIntensityAnalyzer, который позволяет определять, являются ли комментарии положительными, отрицательными или нейтральными, а также присваивать им значение от -1 (очень отрицательный комментарий) до 1 (очень положительный комментарий). Давайте создадим таблицу Executable, которая вычисляет тональность комментариев Hacker News с помощью nltk.
В этом примере используется таблица hackernews, описанная здесь. Таблица hackernews включает столбец id типа UInt64 и столбец comment типа String. Начнем с определения таблицы Executable:
sentiment:
- Файл
sentiment.pyсохраняется в папкеuser_scripts(это папка по умолчанию для настройкиuser_scripts_path) - Формат
TabSeparatedозначает, что наш Python-скрипт должен генерировать строки исходных данных со значениями, разделёнными табуляцией - Запрос выбирает два столбца из
hackernews. Python-скрипту потребуется разобрать значения этих столбцов из входящих строк
sentiment.py:
- Чтобы это работало, вам нужно выполнить
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:
sentiment_pooled.