- UDFs executáveis iniciam um programa ou script externo (Python, Bash etc.) e enviam blocos de dados para ele via STDIN / STDOUT. Use-as para integrar código ou ferramentas existentes sem recompilar o ClickHouse. Elas têm maior sobrecarga por chamada em comparação com opções executadas no mesmo processo e são mais indicadas para lógicas mais pesadas ou quando é necessário um runtime diferente.
- UDFs SQL são definidas com
CREATE FUNCTIONexclusivamente em SQL. Elas são inline/expandidas no plano da consulta (sem separação de processo), o que as torna leves e ideais para reutilizar lógica de expressão ou simplificar colunas calculadas complexas. - UDFs WebAssembly experimentais executam código compilado em WebAssembly dentro de um sandbox no processo do servidor. Elas oferecem menor sobrecarga por chamada do que executáveis externos, com melhor isolamento do que extensões nativas, o que as torna adequadas para algoritmos personalizados escritos em linguagens que podem gerar WASM (por exemplo, C/C++/Rust).
Funções executáveis definidas pelo usuário
Este recurso está disponível em visualização privada no ClickHouse Cloud.
Entre em contato com o suporte do ClickHouse em https://clickhouse.cloud/support para obter acesso.
user_defined_executable_functions_config.
A configuração de uma função contém as seguintes definições:
| Parâmetro | Descrição | Obrigatório | Valor padrão |
|---|---|---|---|
name | Nome da função | Sim | - |
command | Nome do script a ser executado ou comando, se execute_direct for false | Sim | - |
argument | Descrição do argumento com o type e, opcionalmente, o name de um argumento. Cada argumento é descrito em uma configuração separada. Especificar o nome é necessário se os nomes dos argumentos fizerem parte da serialização do formato da função definida pelo usuário, como Native ou JSONEachRow | Sim | c + argument_number |
format | Um formato no qual os argumentos são passados para o comando. Também se espera que a saída do comando use o mesmo formato | Sim | - |
return_type | O tipo de um valor retornado | Sim | - |
return_name | Nome do valor retornado. Especificar o nome de retorno é necessário se ele fizer parte da serialização do formato da função definida pelo usuário, como Native ou JSONEachRow | Opcional | result |
type | Um tipo de executável. Se type estiver definido como executable, um único comando será iniciado. Se estiver definido como executable_pool, um pool de comandos será criado | Sim | - |
max_command_execution_time | Tempo máximo de execução, em segundos, para processar um bloco de dados. Essa configuração é válida apenas para comandos executable_pool | Opcional | 10 |
command_termination_timeout | Tempo, em segundos, durante o qual um comando deve ser encerrado após o fechamento de seu pipe. Após esse período, SIGTERM é enviado ao processo que executa o comando | Opcional | 10 |
command_read_timeout | Timeout para ler dados do stdout do comando, em milissegundos | Opcional | 10000 |
command_write_timeout | Timeout para gravar dados no stdin do comando, em milissegundos | Opcional | 10000 |
pool_size | O tamanho de um pool de comandos | Opcional | 16 |
send_chunk_header | Controla se a contagem de linhas deve ser enviada antes de enviar um fragmento de dados para o processo | Opcional | false |
execute_direct | Se execute_direct = 1, então command será procurado dentro da pasta user_scripts especificada por user_scripts_path. Argumentos adicionais do script podem ser especificados usando espaço em branco como separador. Exemplo: script_name arg1 arg2. Se execute_direct = 0, command é passado como argumento para bin/sh -c | Opcional | 1 |
lifetime | O intervalo de recarga de uma função, em segundos. Se estiver definido como 0, a função não será recarregada | Opcional | 0 |
deterministic | Indica se a função é determinística (retorna o mesmo resultado para a mesma entrada) | Opcional | false |
stderr_reaction | Como lidar com a saída de stderr do comando. Valores: none (ignorar), log (registrar todo o stderr imediatamente), log_first (registrar os primeiros 4 KiB após a saída), log_last (registrar os últimos 4 KiB após a saída), throw (lançar uma exceção imediatamente em caso de qualquer saída no stderr). Ao usar log_first ou log_last com um código de saída diferente de zero, o conteúdo de stderr é incluído na mensagem da exceção | Opcional | log_last |
check_exit_code | Se true, o ClickHouse verificará o código de saída do comando. Um código de saída diferente de zero causa uma exceção | Opcional | true |
STDIN e enviar o resultado para STDOUT. O comando deve processar os argumentos iterativamente. Ou seja, após processar um fragmento de argumentos, ele deve aguardar o próximo fragmento.
Funções executáveis definidas pelo usuário
Exemplos
UDF de script embutido
test_function_sum manualmente, definindo execute_direct como 0, usando configuração XML ou YAML.
- XML
- YAML
Arquivo
test_function.xml (/etc/clickhouse-server/test_function.xml com as configurações de caminho padrão)./etc/clickhouse-server/test_function.xml
Query
Result
UDF a partir de script Python
STDIN e o retorna como uma string.
Crie test_function usando configuração em XML ou YAML.
- XML
- YAML
Arquivo
test_function.xml (/etc/clickhouse-server/test_function.xml com as configurações de caminho padrão)./etc/clickhouse-server/test_function.xml
Crie um arquivo de script
test_function.py na pasta user_scripts (/var/lib/clickhouse/user_scripts/test_function.py com as configurações de caminho padrão).
Query
Result
Leia dois valores de STDIN e retorne a soma deles como um objeto JSON
test_function_sum_json com argumentos nomeados e o formato JSONEachRow usando configuração XML ou YAML.
- XML
- YAML
Arquivo
test_function.xml (/etc/clickhouse-server/test_function.xml com o caminho padrão)./etc/clickhouse-server/test_function.xml
Crie o arquivo de script
test_function_sum_json.py na pasta user_scripts (/var/lib/clickhouse/user_scripts/test_function_sum_json.py com o caminho padrão).
Query
Result
Use parâmetros na configuração command
command (isso funciona apenas para funções definidas pelo usuário do tipo executable).
Isso também exige a opção execute_direct para evitar vulnerabilidades de expansão de argumentos do shell.
- XML
- YAML
Arquivo
test_function_parameter_python.xml (/etc/clickhouse-server/test_function_parameter_python.xml com as configurações de caminho padrão)./etc/clickhouse-server/test_function_parameter_python.xml
Crie o arquivo de script
test_function_parameter_python.py dentro da pasta user_scripts (/var/lib/clickhouse/user_scripts/test_function_parameter_python.py com as configurações de caminho padrão).
Query
Result
UDF com script de shell
- XML
- YAML
Arquivo
test_function_shell.xml (/etc/clickhouse-server/test_function_shell.xml com o caminho padrão)./etc/clickhouse-server/test_function_shell.xml
Crie o script
test_shell.sh dentro da pasta user_scripts (/var/lib/clickhouse/user_scripts/test_shell.sh com o caminho padrão).
/var/lib/clickhouse/user_scripts/test_shell.sh
Query
Result
Tratamento de erros
Avaliação de expressões de argumentos
&&, || e ?:.
No ClickHouse, os argumentos de funções (operadores) são sempre avaliados.
Isso acontece porque partes inteiras de colunas são avaliadas de uma só vez, em vez de cada linha ser calculada separadamente.
Execução de funções no processamento distribuído de consultas
SELECT f(sum(g(x))) FROM distributed_table GROUP BY h(y),
- se uma
distributed_tabletiver pelo menos dois shards, as funções ‘g’ e ‘h’ serão executadas em servidores remotos, e a função ‘f’ será executada no servidor solicitante. - se uma
distributed_tabletiver apenas um shard, todas as funções ‘f’, ‘g’ e ‘h’ serão executadas no servidor desse shard.
hostName, que retorna o nome do servidor em que está sendo executada para permitir o GROUP BY por servidores em uma consulta SELECT.
Se uma função em uma consulta for executada no servidor solicitante, mas você precisar executá-la em servidores remotos, poderá encapsulá-la em uma função agregada ‘any’ ou adicioná-la a uma chave no GROUP BY.