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

Исполняемые и ИсполняемыеПулы Табличные Движки

Движки таблиц 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.