QueryContexts
QueryContext 内で実行します。QueryContext には、ClickHouse データベースに対するクエリの構築に使用される主要な構造と、結果を QueryResult またはその他の応答データ構造に変換するための設定が含まれます。これには、クエリ自体、パラメータ、設定、読み取りフォーマット、その他のプロパティが含まれます。
QueryContext は、クライアントの create_query_context メソッドを使用して取得できます。このメソッドは、中核となるクエリメソッドと同じパラメータを受け取ります。取得したクエリコンテキストは、その後 query、query_df、または query_np メソッドに対して、これらのメソッドの他の引数の一部またはすべての代わりに、context キーワード引数として渡すことができます。なお、メソッド呼び出しで追加指定した引数は、QueryContext の各プロパティより優先されます。
QueryContext の最もわかりやすいユースケースは、同じクエリを異なるバインドパラメータ値で送信することです。すべてのパラメータ値は、辞書を指定して QueryContext.set_parameters メソッドを呼び出すことで更新できます。また、個々の値は、目的の key、value の組を指定して QueryContext.set_parameter を呼び出すことで更新できます。
QueryContext はスレッドセーフではありませんが、マルチスレッド環境では QueryContext.updated_copy メソッドを呼び出すことで、そのコピーを取得できます。
ストリーミングクエリ
query_column_block_stream— クエリデータを、Python ネイティブオブジェクトを使用して、カラムのシーケンスとしてブロック単位で返しますquery_row_block_stream— クエリデータを、Python ネイティブオブジェクトを使用して、行のブロックとして返しますquery_rows_stream— クエリデータを、Python ネイティブオブジェクトを使用して、行のシーケンスとして返しますquery_np_stream— クエリデータの各 ClickHouse ブロックを NumPy 配列として返しますquery_df_stream— クエリデータの各 ClickHouse ブロックを Pandas DataFrame として返しますquery_arrow_stream— クエリデータを PyArrowRecordBatchオブジェクトとして返しますquery_df_arrow_stream—dataframe_libraryによって選択された Pandas または Polars DataFrame として、各 Arrow バッチを返します
StreamContext を返し、with ステートメントで開く必要があります。async クライアントのストリーミングメソッドは await で待機し、async with で開きます。
データブロック
query メソッドから取得されるすべてのデータを、ClickHouse server から受信するブロックのストリームとして処理します。これらのブロックは、ClickHouse との間でカスタムの「Native」フォーマットを使って送受信されます。「ブロック」は、指定されたデータ型のバイナリデータで構成されたカラムの並びにすぎず、各カラムには同じ数のデータ値が含まれます。 (列指向データベースである ClickHouse では、データもこれに近い形式で保存されます。) クエリから返されるブロックのサイズは、複数のレベル (user profile、user、session、または query) で設定できる 2 つのユーザー設定によって決まります。設定項目は次のとおりです。
- max_block_size — ブロックサイズの上限 (行数) 。
- preferred_block_size_bytes — 推奨されるブロックサイズ (バイト数) 。
preferred_block_size_bytes にかかわらず、ブロックが max_block_size 行を超えることはありません。実際のサイズはこれより小さい場合があり、安定しているものとして扱うべきではありません。
Client の query_*_stream メソッドのいずれかを使用すると、結果はブロック単位で返されます。ClickHouse Connect は、一度に 1 つのブロックだけを読み込みます。これにより、大きな結果セット全体をメモリに読み込むことなく、大量のデータを処理できます。アプリケーションは、任意の数のブロックを処理できるようにしておく必要があり、各ブロックの正確なサイズは制御できない点に注意してください。
処理が遅い場合の HTTP データバッファ
http_buffer_size を増やしてください。デフォルトは 10 MiB です。lz4 と zstd の応答バイトはこのバッファ内で圧縮されたまま保持されるため、実効容量は大きくなります。
StreamContexts
query_*_stream メソッド (query_row_block_stream など) は、Python のコンテキストマネージャーとジェネレーターを組み合わせた ClickHouse の StreamContext オブジェクトを返します。基本的な使い方は次のとおりです。
with ステートメントを使わずに StreamContext を使用しようとすると、エラーが発生する点に注意してください。Python のコンテキストを使うことで、ストリーム (この場合はストリーミング HTTP レスポンス) は、すべてのデータが消費されなかった場合や、処理中に例外が発生した場合でも、適切にクローズされます。また、StreamContext はストリームの消費に一度しか使用できません。終了後の StreamContext を使用しようとすると、StreamClosedError が発生します。
結果の読み取り中に接続が失敗した場合、切り詰められた結果が暗黙的に返されるのではなく、StreamFailureError が発生します。そのメッセージはクライアントの show_clickhouse_errors 設定に従います。
StreamContext の source プロパティを使うと、カラム名と型を含む親の結果オブジェクトにアクセスできます。ほとんどのストリームではこれは QueryResult ですが、query_np_stream と query_df_stream メソッドでは代わりに NumpyResult が公開されます。
ストリームの種類
query_column_block_stream メソッドは、ブロックを、ネイティブの Python データ型として格納されたカラムデータのシーケンスとして返します。上記の taxi_trips クエリを使うと、返されるデータはリストになり、その各要素は対応するカラムのすべてのデータを含む別のリスト (またはタプル) になります。したがって block[0] は、文字列だけを含むタプルになります。カラム指向のフォーマットは、運賃の合計を足し上げるといった、あるカラム内のすべての値に対する集計処理で最もよく使われます。
query_row_block_stream メソッドは、従来のリレーショナルデータベースのように、ブロックを行のシーケンスとして返します。タクシー乗車データでは、返されるデータはリストになり、その各要素はデータの1行を表す別のリストになります。したがって block[0] には最初のタクシー乗車のすべてのフィールドが (順番どおりに) 含まれ、block[1] には2番目のタクシー乗車のすべてのフィールドを含む行が入ります。以降も同様です。行指向の結果は、通常、表示や変換処理に使われます。
query_rows_stream メソッドは、自動的に次のブロックへ進み、1回に1行ずつ返します。これは query_row_block_stream の行単位の対応メソッドです。
query_np_stream メソッドは、各ブロックを NumPy 配列として返します。すべての結果カラムが同じ NumPy dtype を共有している場合、配列は shape が (rows, columns) の2次元になります。型が混在する結果は、1次元の structured array として返されるか、object dtype が使用されます。
query_df_stream メソッドは、各 ClickHouse Block を2次元の Pandas DataFrame として返します。以下の例は、StreamContext オブジェクトを遅延的にコンテキストとして使用できることを示しています (ただし1回のみ) 。
query_df_arrow_stream メソッドは、Arrow バッチを Pandas または Polars の DataFrame に変換します。使用するライブラリは dataframe_library で選択し、既定値は "pandas" です。
最後に、query_arrow_stream は ClickHouse の ArrowStream レスポンスを StreamContext でラップします。各反復では、PyArrow の RecordBatch が返されます。
ストリーミングの使用例
行のストリーミング
行ブロックをストリーミングする
Pandas DataFrame をストリーミングする
Arrow バッチをストリーミングする
行を非同期でストリームする
NumPy、Pandas、Arrow クエリ
NumPy クエリ
query_np メソッドは、ClickHouse Connect の QueryResult ではなく、NumPy 配列としてクエリ結果を返します。
Pandas クエリ
query_df メソッドは、ClickHouse Connect の QueryResult ではなく、クエリ結果を Pandas の DataFrame として返します。
PyArrow クエリ
query_arrow メソッドは、ClickHouse の Arrow 出力フォーマットを直接使用して PyArrow Table を返します。受け付ける引数は query、parameters、settings、external_data、transport_settings です。use_strings オプションは、ClickHouse の String カラムを Arrow の文字列として出力するか、バイナリ値として出力するかを制御します。
Arrow バックエンド DataFrames
query_df_arrow と query_df_arrow_stream により、Arrow の結果から DataFrame を効率的に作成できます。これらのメソッドは Python の行オブジェクトを経由する変換を避け、対象のライブラリが対応していれば Arrow バッファを再利用します。
query_df_arrow: ClickHouse のArrow出力フォーマットを使用してクエリを実行し、DataFrame を返します。dataframe_library="pandas"は、pd.ArrowDtypeを使用する Pandas 2.0 以降の DataFrame を返します。dataframe_library="polars"は、pl.from_arrowを使って作成された Polars DataFrame を返します。
query_df_arrow_stream: Arrow のバッチを Pandas または Polars の DataFrame としてストリーミングします。
ArrowバックエンドのDataFrameへのクエリ
注意事項と留意点
- Arrow スキーマは ClickHouse によって制御されます。Arrow で直接表現できない型は、バイナリフィールドを含む互換性のある物理型で返される場合があります。アプリケーション固有の変換を適用する前に、
table.schemaまたは DataFrame の dtype を確認してください。 - Arrow バックエンドの Pandas の結果を利用するには、Pandas 2.0 以降が必要です。
use_stringsは、サーバーがoutput_format_arrow_string_as_stringをサポートしている場合に、ClickHouse のStringカラムで Arrow の string フィールドと binary フィールドのどちらを使用するかを制御します。tz_mode="schema"は、Arrow ベースのクエリメソッドではまだサポートされていません。これらのメソッドは警告を出し、Arrow レスポンスで提供されたタイムゾーンのメタデータを保持します。
読み取りフォーマット
query、query_np、query_df が返す値を制御します。raw メソッドや Arrow メソッドには適用されません。これらのメソッドはサーバーの出力フォーマットを直接使用するためです。たとえば、UUID の読み取りフォーマットを "string" に設定すると、uuid.UUID オブジェクトではなく UUID 文字列が返されます。
任意のフォーマット関数の “data type” 引数にはワイルドカードを含めることができます。フォーマットは小文字 1 つからなる文字列です。Array、Nullable、LowCardinality などのコンテナーラッパーでは、その要素型に対して選択したフォーマットが維持されます。
読み取りフォーマットは、複数のレベルで設定できます。
clickhouse_connect.datatypes.formatパッケージで定義されているメソッドを使用して、グローバルに設定できます。これにより、設定したデータ型のフォーマットがすべてのクエリで適用されます。
- オプションの
query_formats辞書引数を使用すると、クエリ全体に対して指定できます。この場合、指定したデータ型の任意のカラム (またはサブカラム) に、設定されたフォーマットが適用されます。
- 特定の結果カラムに対しては、省略可能な
column_formats辞書を使用します。各キーには返されるカラム名を指定します。値には、フォーマット文字列、または ClickHouse の型名からフォーマットへのネストされたマッピングを指定できます。これは Tuples、Maps、その他のコンテナー型で役立ちます。
読み取りフォーマットオプション (Python 型)
外部データ
external_data パラメータを通じて clickhouse_connect.driver.external.ExternalData オブジェクトを受け取ります。
この例では、外部 CSVファイルをサーバー上に保存されている
directors テーブルに結合しています:
add_file メソッドを使って、最初の ExternalData オブジェクトに追加できます。HTTP では、すべての外部データは multi-part/form-data によるファイルアップロードの一部として送信されます。
chDB バックエンドは外部データをサポートしていません。
タイムゾーン
DateTime および DateTime64 の値は、epoch ベースの数値として送信されます。ClickHouse Connect は、カラムのメタデータ、クエリのオーバーライド、クライアントのタイムゾーンポリシーを使用して、これらを Python の datetime オブジェクトに変換します。
クライアントには、互いに独立した 2 つのタイムゾーンオプションがあります。
tz_sourceは、明示的なタイムゾーンメタデータを持たないカラムに対するフォールバックのタイムゾーンを選択します。"auto"がデフォルトです。クライアントが夏時間の切り替えをまたいでも安全に解決できる場合はサーバータイムゾーンを使用し、そうでない場合はローカルタイムゾーンを使用します。"server"は常にサーバータイムゾーンを使用します。"local"は常にローカルプロセスのタイムゾーンを使用します。
tz_modeはタイムゾーン対応を制御します。"naive_utc"がデフォルトです。UTC および UTC 相当の結果は、後方互換性のため、naive なdatetimeオブジェクトとして返されます。"aware"は UTC の tzinfo を保持し、タイムゾーン対応の UTC 値を返します。"schema"は、カラム型でタイムゾーンが宣言されている場合にのみタイムゾーン対応の値を返し、タイムゾーン指定のないDateTime/DateTime64カラムには naive な値を返します。
"naive_utc" および "aware" クエリでは、有効なタイムゾーンは次の順序で選択されます。
- カラムごとの
column_tzsオーバーライド。 - ClickHouse のカラム型に含まれるタイムゾーンメタデータ。
- クエリ全体に適用される
query_tzオーバーライド。 - HTTP レスポンスとともに返されるタイムゾーン情報。
tz_sourceで選択されたフォールバック。
tz_mode="schema" はクエリおよびフォールバックのタイムゾーンを無視しますが、明示的な column_tzs オーバーライドは引き続き優先されます。
zoneinfo モジュールで解決されます。Windows へのインストールでは tzdata が自動的に自動的に含まれます。IANA タイムゾーンデータベースを含まない最小構成の Linux イメージでは、clickhouse-connect[tzdata] をインストールしてください。
Pandas の結果では、DateTime は datetime64[s]、DateTime64(3) は datetime64[ms] というように、各 ClickHouse 型本来の精度が保持されます。Arrow バックエンドの DataFrame メソッド query_df_arrow と query_df_arrow_stream は、まだ tz_mode="schema" に対応しておらず、これが指定されると警告を出します。query_arrow と query_arrow_stream は、Arrow レスポンスのタイムゾーン メタデータを変更せずにそのまま返します。