実行可能および実行プールテーブルエンジン
Executable
および ExecutablePool
テーブルエンジンを使用すると、あなたが定義したスクリプトから生成された行を持つテーブルを定義できます(stdout に行を書き込むことによって)。実行可能なスクリプトは users_scripts
ディレクトリに保存され、任意のソースからデータを読み取ることができます。
Executable
テーブル: 各クエリごとにスクリプトが実行されますExecutablePool
テーブル: 永続的なプロセスのプールを維持し、プールからプロセスを取得して読み込みます
オプションで、スクリプトが読み取るために結果を stdin にストリームする1つ以上の入力クエリを含めることができます。
実行可能テーブルの作成
Executable
テーブルエンジンには、スクリプトの名前と受信データの形式という2つのパラメータが必要です。オプションで、1つ以上の入力クエリを渡すことができます:
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
を読み取り、10個のランダムな文字列を出力します。各文字列の前にはタブで区切られた数字が付きます:
次の my_executable_table
は my_script.py
の出力から構築されます。これにより、my_executable_table
から SELECT
を実行するたびに10個のランダムな文字列が生成されます:
テーブルの作成はすぐに戻り、スクリプトは呼び出されません。my_executable_table
をクエリすると、スクリプトが呼び出されます:
スクリプトにクエリ結果を渡す
Hacker News ウェブサイトのユーザーはコメントを残します。Python には、コメントがポジティブ、ネガティブ、またはニュートラルであるかを判断するための自然言語処理ツールキット(nltk
)があり、-1(非常にネガティブなコメント)から1(非常にポジティブなコメント)までの値を割り当てることができます。それでは、nltk
を使用して Hacker News コメントの感情を計算する Executable
テーブルを作成しましょう。
この例では、こちらで説明されている hackernews
テーブルを使用します。hackernews
テーブルには、UInt64
型の id
カラムと String
型の comment
カラムが含まれています。それでは、Executable
テーブルを定義して始めましょう:
sentiment
テーブルについてのいくつかのコメント:
- ファイル
sentiment.py
はuser_scripts
フォルダに保存されています(user_scripts_path
設定のデフォルトフォルダ) TabSeparated
形式は、Python スクリプトがタブ区切りの値を含む生データの行を生成する必要があることを意味します- クエリは
hackernews
から2つのカラムを選択します。Python スクリプトは、受信行からそのカラム値を解析する必要があります
以下が sentiment.py
の定義です:
私たちの Python スクリプトについてのいくつかのコメント:
- これが機能するためには、
nltk.downloader.download('vader_lexicon')
を実行する必要があります。これはスクリプト内に置くこともできますが、そうするとsentiment
テーブルのクエリが実行されるたびに毎回ダウンロードされてしまうため、効率的ではありません row
の各値はSELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20
の結果セットの行になります- 受信行はタブ区切りであるため、Python の
split
関数を使用してid
とcomment
を解析します polarity_scores
の結果は多数の値を持つ JSON オブジェクトです。私たちはこの JSON オブジェクトのcompound
値を取得することにしましたsentiment
テーブルは ClickHouse でTabSeparated
形式を使用し、2つのカラムを含むため、私たちの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
テーブルを Executable
の代わりに ExecutablePool
を使用するように簡単に変換できます:
ClickHouse は、クライアントが sentiment_pooled
テーブルをクエリする際に、オンデマンドで4つのプロセスを維持します。