- 実行可能 UDF は、外部プログラムやスクリプト (Python、Bash など) を起動し、STDIN / STDOUT を介してデータのブロックをストリーミングします。ClickHouse を再コンパイルすることなく、既存のコードやツールを統合するために使用できます。インプロセスの選択肢と比べると呼び出しごとのオーバーヘッドは大きく、より重いロジックや別のランタイムが必要な場合に適しています。
- SQL UDFs は、
CREATE FUNCTIONを使って SQL のみで定義されます。これらはクエリプランにインライン展開されるため (プロセス境界はありません) 、軽量で、式ロジックの再利用や複雑な計算カラムの簡略化に適しています。 - Experimental WebAssembly UDFs は、WebAssembly にコンパイルされたコードを、サーバープロセス内のサンドボックスで実行します。外部の実行可能ファイルよりも呼び出しごとのオーバーヘッドが低く、ネイティブ拡張機能よりも優れた分離性を備えているため、WASM をターゲットにできる言語 (例: C/C++/Rust) で記述されたカスタムアルゴリズムに適しています。
実行可能ユーザー定義関数
この機能は、ClickHouse Cloud でプライベートプレビューとして提供されています。
利用するには、https://clickhouse.cloud/support から ClickHouse Support にお問い合わせください。
user_defined_executable_functions_config パラメータで指定します。
関数の設定には、次の項目が含まれます:
| Parameter | Description | Required | Default Value |
|---|---|---|---|
name | 関数名 | はい | - |
command | 実行するスクリプト名、または execute_direct が false の場合は実行コマンド | はい | - |
argument | 引数の type と、必要に応じて引数の name を指定します。各引数は個別の設定として記述します。Native や JSONEachRow など、ユーザー定義関数のフォーマットで引数名がシリアライゼーションの一部となる場合は、name の指定が必要です | はい | c + argument_number |
format | 引数をコマンドに渡す際の フォーマット。コマンドの出力でも同じフォーマットを使用する必要があります | はい | - |
return_type | 戻り値の型 | はい | - |
return_name | 戻り値の名前。Native や JSONEachRow など、ユーザー定義関数のフォーマットで戻り値の名前がシリアライゼーションの一部となる場合は、return_name の指定が必要です | 任意 | result |
type | 実行可能の種類。type が executable に設定されている場合は単一のコマンドが起動され、executable_pool に設定されている場合はコマンドのプールが作成されます | はい | - |
max_command_execution_time | データの block を処理する際の最大実行時間 (秒) 。この設定は executable_pool コマンドでのみ有効です | 任意 | 10 |
command_termination_timeout | パイプが閉じられたあと、コマンドの終了を待機する時間 (秒) 。この時間を過ぎると、コマンドを実行しているプロセスに SIGTERM が送信されます | 任意 | 10 |
command_read_timeout | コマンドの stdout からデータを読み取る際のタイムアウト (ミリ秒) | 任意 | 10000 |
command_write_timeout | コマンドの stdin にデータを書き込む際のタイムアウト (ミリ秒) | 任意 | 10000 |
pool_size | コマンドプールのサイズ | 任意 | 16 |
send_chunk_header | process にデータの chunk を送信する前に、行数を送信するかどうかを制御します | 任意 | false |
execute_direct | execute_direct = 1 の場合、command は user_scripts_path で指定された user_scripts フォルダー内から検索されます。追加のスクリプト引数は空白区切りで指定できます。例: script_name arg1 arg2。execute_direct = 0 の場合、command は bin/sh -c の引数として渡されます | 任意 | 1 |
lifetime | 関数の再読み込み間隔 (秒) 。0 に設定すると、関数は再読み込みされません | 任意 | 0 |
deterministic | 関数が決定論的かどうか (同じ入力に対して常に同じ結果を返すか) | 任意 | false |
stderr_reaction | コマンドの stderr 出力の扱い方。値: none (無視) 、log (stderr をすべて即座に記録) 、log_first (終了後に先頭 4 KiB を記録) 、log_last (終了後に末尾 4 KiB を記録) 、throw (stderr に出力があった時点で直ちに例外を送出) 。log_first または log_last をゼロ以外の終了コードとともに使用した場合、stderr の内容が例外メッセージに含まれます | 任意 | log_last |
check_exit_code | true の場合、ClickHouse はコマンドの終了コードを確認します。終了コードがゼロ以外の場合は例外が発生します | 任意 | true |
STDIN から引数を読み取り、結果を STDOUT に出力する必要があります。また、引数は反復的に処理する必要があります。つまり、1 つの chunk の引数を処理したら、次の chunk を待機しなければなりません。
実行可能ユーザー定義関数
例
インラインスクリプトからの UDF
execute_direct を 0 に明示的に指定し、test_function_sum を手動で作成します。
- XML
- YAML
test_function.xml ファイル (デフォルトのパス設定では /etc/clickhouse-server/test_function.xml) 。/etc/clickhouse-server/test_function.xml
Query
Result
Python スクリプトからの UDF
STDIN から値を読み取り、それを文字列として返す UDF を作成します。
XML または YAML の設定を使用して test_function を作成します。
- XML
- YAML
ファイル
test_function.xml (デフォルトのパス設定では /etc/clickhouse-server/test_function.xml) 。/etc/clickhouse-server/test_function.xml
user_scripts フォルダー内にスクリプトファイル test_function.py を作成します (デフォルトのパス設定では /var/lib/clickhouse/user_scripts/test_function.py) 。
Query
Result
STDIN から 2 つの値を読み取り、その合計を JSON オブジェクトとして返す
test_function_sum_json を作成します。
- XML
- YAML
ファイル
test_function.xml (デフォルトのパス設定では /etc/clickhouse-server/test_function.xml) 。/etc/clickhouse-server/test_function.xml
user_scripts フォルダー内にスクリプトファイル test_function_sum_json.py を作成します (デフォルトのパス設定では /var/lib/clickhouse/user_scripts/test_function_sum_json.py) 。
Query
Result
command 設定でパラメータを使用する
command 設定で構成した定数パラメータを受け取れます (これは executable 型のユーザー定義関数でのみ機能します) 。
また、シェルの引数展開による脆弱性を防ぐため、execute_direct オプションも必要です。
- XML
- YAML
ファイル
test_function_parameter_python.xml (デフォルトのパス設定では /etc/clickhouse-server/test_function_parameter_python.xml) 。/etc/clickhouse-server/test_function_parameter_python.xml
user_scripts フォルダ内にスクリプトファイル test_function_parameter_python.py を作成します (デフォルトのパス設定では /var/lib/clickhouse/user_scripts/test_function_parameter_python.py) 。
Query
Result
シェルスクリプトによるUDF
- XML
- YAML
ファイル
test_function_shell.xml (デフォルトのパス設定の場合は /etc/clickhouse-server/test_function_shell.xml) 。/etc/clickhouse-server/test_function_shell.xml
user_scripts フォルダー内に、スクリプトファイル test_shell.sh を作成します (デフォルトのパス設定の場合は /var/lib/clickhouse/user_scripts/test_shell.sh) 。
/var/lib/clickhouse/user_scripts/test_shell.sh
Query
Result
エラー処理
引数式の評価
&&、||、?: といった演算子です。
ClickHouse では、関数 (演算子) の引数は常に評価されます。
これは、各行を個別に計算するのではなく、カラムのパーツ全体が一度に評価されるためです。
分散クエリ処理における関数の実行
SELECT f(sum(g(x))) FROM distributed_table GROUP BY h(y), では、
distributed_tableに少なくとも2つの分片がある場合、関数 ‘g’ と ‘h’ はリモートサーバーで実行され、関数 ‘f’ はリクエスト元のサーバーで実行されます。distributed_tableに分片が1つしかない場合、‘f’、‘g’、‘h’ のすべての関数はこの分片のサーバーで実行されます。
hostName 関数は、自身が実行されているサーバーの名前を返します。これは、SELECT クエリでサーバーごとに GROUP BY できるようにするためです。
クエリ内の関数がリクエスト元のサーバーで実行されるものの、リモートサーバーで実行する必要がある場合は、その関数を ‘any’ 集約関数でラップするか、GROUP BY のキーに追加できます。