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つのプロセスを維持します。