Pular para o conteúdo principal
Os motores de tabela Executable e ExecutablePool permitem definir uma tabela cujas linhas são geradas por um script que você define (ao gravar linhas em stdout). O script executável é armazenado no diretório user_scripts e pode ler dados de qualquer origem.
  • Tabelas Executable: o script é executado em cada consulta
  • Tabelas ExecutablePool: mantêm um pool de processos persistentes e usam processos desse pool para leituras
Opcionalmente, é possível incluir uma ou mais consultas de entrada que transmitem seus resultados para stdin, para que o script possa lê-los.

Criando uma tabela Executable

O mecanismo de tabela Executable requer dois parâmetros: o nome do script e o formato dos dados de entrada. Opcionalmente, é possível passar uma ou mais consultas de entrada:
Aqui estão as configurações relevantes para uma tabela Executable:
  • send_chunk_header
    • Descrição: Envia o número de linhas em cada fragmento antes de enviá-lo para processamento. Essa configuração pode ajudar você a escrever o script de forma mais eficiente, pré-alocando alguns recursos
    • Valor padrão: false
  • command_termination_timeout
    • Descrição: Tempo limite para encerramento do comando, em segundos
    • Valor padrão: 10
  • command_read_timeout
    • Descrição: Tempo limite para ler dados da stdout do comando, em milissegundos
    • Valor padrão: 10000
  • command_write_timeout
    • Descrição: Tempo limite para gravar dados na stdin do comando, em milissegundos
    • Valor padrão: 10000
Vamos ver um exemplo. O script Python a seguir se chama my_script.py e está salvo na pasta user_scripts. Ele lê um número i e imprime i strings aleatórias, cada uma precedida por um número separado por uma tabulação:
A tabela my_executable_table a seguir é criada a partir da saída de my_script.py, que gera 10 strings aleatórias sempre que você executa um SELECT em my_executable_table:
A criação da tabela é concluída imediatamente e não executa o script. Ao consultar my_executable_table, o script é executado:

Passando resultados de consulta para um script

Os usuários do site Hacker News deixam comentários. O Python inclui um kit de ferramentas de processamento de linguagem natural (nltk) com um SentimentIntensityAnalyzer para determinar se os comentários são positivos, negativos ou neutros, inclusive atribuindo um valor entre -1 (um comentário muito negativo) e 1 (um comentário muito positivo). Vamos criar uma tabela Executable que calcula o sentimento dos comentários do Hacker News usando nltk. Este exemplo usa a tabela hackernews descrita aqui. A tabela hackernews inclui uma coluna id do tipo UInt64 e uma coluna String chamada comment. Vamos começar definindo a tabela Executable:
Alguns comentários sobre a tabela sentiment:
  • O arquivo sentiment.py é salvo na pasta user_scripts (a pasta padrão da configuração user_scripts_path)
  • O formato TabSeparated significa que nosso script Python precisa gerar linhas de dados brutos com valores separados por tabulação
  • A consulta seleciona duas colunas de hackernews. O script Python precisará extrair os valores dessas colunas das linhas recebidas
Aqui está a definição de sentiment.py:
Alguns comentários sobre nosso script em Python:
  • Para que isso funcione, você precisará executar nltk.downloader.download('vader_lexicon'). Isso poderia ter sido incluído no script, mas, nesse caso, seria baixado toda vez que uma consulta fosse executada na tabela sentiment — o que não é eficiente
  • Cada valor de row corresponderá a uma linha no conjunto de resultados de SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20
  • A linha recebida é separada por tabulação, então extraímos o id e o comment usando a função split do Python
  • O resultado de polarity_scores é um objeto JSON com alguns valores. Decidimos simplesmente usar o valor compound desse objeto JSON
  • Lembre-se de que a tabela sentiment no ClickHouse usa o formato TabSeparated e contém duas colunas, então nossa função print separa essas colunas com uma tabulação
Toda vez que você escreve uma consulta que seleciona linhas da tabela sentiment, a consulta SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20 é executada, e o resultado é passado para sentiment.py. Vamos testar:
A resposta é assim:

Criando uma tabela ExecutablePool

A sintaxe de ExecutablePool é semelhante à de Executable, mas há algumas configurações importantes exclusivas de uma tabela ExecutablePool:
  • pool_size
    • Descrição: Tamanho do pool de processos. Se o tamanho for 0, não haverá restrições de tamanho
    • Valor padrão: 16
  • max_command_execution_time
    • Descrição: Tempo máximo de execução do comando, em segundos
    • Valor padrão: 10
Podemos converter facilmente a tabela sentiment acima para usar ExecutablePool em vez de Executable:
O ClickHouse manterá 4 processos conforme necessário quando seu cliente consultar a tabela sentiment_pooled.
Última modificação em 2 de julho de 2026