Executable
と ExecutablePool
テーブルエンジン
Executable
と ExecutablePool
テーブルエンジンを使用すると、定義したスクリプトから生成された行を持つテーブルを定義できます (スクリプトが stdout に行を書き込みます)。実行可能なスクリプトは users_scripts
ディレクトリに保存され、任意のソースからデータを読み取ることができます。
Executable
テーブル: スクリプトはすべてのクエリで実行されますExecutablePool
テーブル: 永続プロセスのプールを維持し、プールからプロセスを取得して読み込みます
オプションで、スクリプトが読み取るために結果を stdin にストリーミングする1つ以上の入力クエリを含めることができます。
Executable
テーブルの作成
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
を読み込み、i
個のランダムな文字列を出力し、各文字列の前にタブで区切られた数値を付加します。
次の my_executable_table
は、my_script.py
の出力から作成され、my_executable_table
から SELECT
を実行するたびに10個のランダムな文字列を生成します。
テーブルの作成は即座に戻り、スクリプトは呼び出されません。my_executable_table
をクエリすると、スクリプトが呼び出されます。
クエリ結果をスクリプトに渡す
Hacker News ウェブサイトのユーザーはコメントを投稿します。Python には、コメントがポジティブ、ネガティブ、または中立であるかを判断するための自然言語処理ツールキット (nltk
) があります。このツールキットには、-1(非常にネガティブなコメント)から1(非常にポジティブなコメント)の間の値を割り当てることを含む SentimentIntensityAnalyzer
があります。では、nltk
を使用してHacker News のコメントの感情を計算する Executable
テーブルを作成しましょう。
この例では、こちらで説明されている hackernews
テーブルを使用します。hackernews
テーブルには、UInt64
型の id
カラムと comment
という名前の String
カラムが含まれています。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
値を取得することに決めました- ClickHouse の
sentiment
テーブルは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つのプロセスを維持します。