概要
説明
chdb_hook モジュールは PostgreSQL の COPY コマンドにフックし、 ローカルファイル、AWS S3 bucket、Google Cloud ストレージ などを対象として、 [chDB がサポートするデータフォーマット][formats] のいずれかで chDB によるデータのコピー (TO / FROM) を行えるようにします。
さらに CREATE TABLE にもフックするため、テーブルはこれらと同じターゲットから
カラムを導出し、行を読み込むことができます。
ロード
以下のいずれかの方法で、super user として chdb_hook をロードします。ユースケースに最も適した方法を選んでください:-
LOAD コマンドによる明示的なロード。session が続く間のみ有効です:
ClickHouse Cloud の SQL Console は現時点では
LOAD 'chdb_hook'コマンドに対応していませんが、psql やその他の database connection 経由であれば実行できます。 そうでない場合は、サポート担当者に連絡して Postgres service の configuration に追加してもらってください。追加後は SQL Console でも使用できるようになります。 -
すべての sessions を対象とする場合は、
postgresql.confで [session_preload_libraries] SETTING を指定します:または ALTER SYSTEM を使用します:この SETTING は ALTER DATABASE を使って database 単位で設定することもできます:また、ALTER ROLE を使って特定のユーザーやグループに対して設定することもできます: -
[shared_preload_libraries] SETTING により server 起動時にロードする方法。すべての sessions と databases から常に利用できるようになります:
COPY のオーバーロード
ロード時に、chdb_hook は Postgres の COPY コマンドにフックし、 ローカルファイル、AWS S3 バケット、Google Cloud ストレージ などにある [chDB がサポートするデータフォーマット][formats] のいずれかに対して、TO でデータを書き出したり
FROM で読み込んだりできるようにします。たとえば S3 上の CSV ファイルから
テーブルを読み込むには、テーブルを作成してから s3:// URL を指定して COPY を呼び出します:
Privileges
chdb_hook のCOPY には、置き換え対象の COPY と同じ権限が必要です。
すなわち、COPY TO の場合は relation またはコピー対象のすべてのカラムに対する SELECT、
COPY FROM の場合は INSERT です。file:// URL は server 上のファイルを読み書きするため、
pg_read_server_files または pg_write_server_files のメンバーであることも必要です。
COPY FROM には read-write の transaction が必要です。
URL スキーム
chdb_hook は、次のいずれかのスキームを使用する URLCOPY ターゲットに対してのみ実行されます。
URL フォーマット
URL のフォーマットは、ターゲットによって異なります。File
Postgres サーバー上の絶対パスである必要があります。相対パスを指定した場合はエラーになります。Postgres ユーザーは、用途に応じてpg_read_server_files または pg_write_server_files ロールのメンバーである必要があります。また、Postgres のシステムユーザーには、用途に応じて対象ファイルへの読み取りまたは書き込みアクセス権が必要です。COPY TO の場合、パスが存在しなければ chdb_hook が不足している親ディレクトリを作成しますが、そのためにはファイルシステム上の権限が必要です。例:
HTTP
パブリックな cloud ストレージ上のものを含め、通常の HTTP URL であれば利用できます。COPY TO の場合、
chdb_hook はその URL に対してデータを POST しようとします。例:
S3
S3 URL は S3 URI の形式で指定することもできますGCS
GCS の URL は、パブリック URL の形式を取ります。Azure Blob Storage
サブドメインにアカウント名を指定したblob.windows.net の URL を使用します:
Azure ABFS
ABFS URL は次のフォーマットである必要があります:HDFS URL
HDFS URL には、一般的な HTTP 形式の URL を使用でき、ポートは任意で指定できます:パスのワイルドカード
COPY FROM コマンドの URL パスにはグロブを含めることができます。ファイルは接尾辞やプレフィックスだけでなく、パスパターン全体に一致する必要があります。例外が1つあり、パスが既存のディレクトリを指していてグロブを使用していない場合は、そのディレクトリ内のすべてのファイルを選択するために * が暗黙的にパスへ追加されます。
サポートされているワイルドカードは次のとおりです。
*:/を除く任意の文字に任意個数一致します (空文字列を含む) 。?: 任意の1文字に一致します。{groucho,harpo,chico}: 文字列 “groucho”、“harpo”、“chico” のいずれかに置き換えます。これらの文字列には/を含めることができます。{N..M}:>= Nかつ<= Mの任意の数値に一致します。**: ディレクトリ内のすべてのファイルに再帰的に一致します。
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_1.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_2.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_3.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_1.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_2.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_3.csv
{some,another}_prefix で2つのディレクトリ名に、some_file_{1..3}.csv' でファイルに一致させます。次のように記述します。
オプション
chdb_hook のCOPY コマンドは、次のオプションをサポートします。
format:
読み取りまたは書き込みに使用するフォーマット。chDB が提供する [formats] のいずれかを指定する必要があり、TSV、CSV、Parquet、Iceberg、JSON などが利用できます。省略するか auto に設定した場合は、chDB が URL 末尾のファイル名の拡張子からフォーマットを判別します。
structure
行を表す chDB のデータ構造です。カラム名と ClickHouse データ型、および修飾子のリストで構成されます。省略した場合、chdb_hook は Postgres のデータ型を、おおむね適切な ClickHouse の型にマッピングします。詳細は Postgres から
chDB へ を参照してください。auto を指定した場合、chDB が型の推論を試みます。
例:
access_key と access_secret
リクエストを認証するために使用する、AWS アカウントユーザーの長期認証情報です。
- S3: AWS の [access key ID と access secret]。多くの場合、環境変数
AWS_ACCESS_KEY_IDおよびAWS_SECRET_ACCESS_KEYで指定します - GCS: GCP の HMACキーとシークレット
- Azure: Azure ストレージアカウント名と access key
session_token
access_key および access_secret と併用する AWS のセッショントークンで、多くの場合は環境変数 AWS_SESSION_TOKEN で定義されます。S3 の URL の場合にのみ使用されます。
compression
ファイルの圧縮フォーマット。ファイル名から圧縮方式を推論できない場合に使用します。サポートされる値:
auto(デフォルト)nonegzipまたはgzbrotliまたはbrxzまたはLZMAzstdまたはzstlz4bz2snappy
timeout
リクエストのタイムアウト (ミリ秒) 。HTTP、S3、GCS、Azure の URL に適用されます。
デフォルトは 30000 (30秒) です。
デバッグ
エラー発生時、chdb_hook のCOPY コマンドは、実行を試みた chDB クエリをエラーコンテキストに含めます:
{name:Type} 形式のプレースホルダーを使用します。
ただし、問題をデバッグするためにこれらのパラメータの内容を確認する必要がある場合は、Postgres の [log_min_messages] GUC を一時的に DEBUG1 以上に設定してください。これにより、chdb_hook はクエリとパラメータを Postgres のログ (クライアントには送信されません) に出力し、次のように表示されます:
CREATE TABLE のオーバーロード
chdb_hook は CREATE TABLE にもフックするため、テーブルは URL からカラムを導出し、行を読み込むことができます。 URL から導出した structure でテーブルを作成するには、structure_from オプションに URL を渡し、カラムリストを空のままにします:
copy_from を使用して、カラムだけでなく行も読み込みます:
copy_from は、ステートメント自身がカラムを 1 つも指定していない場合にのみカラムを推論します。カラムリスト、INHERITS 句、OF 型、パーティションは、いずれもカラムを定義するため、その場合 copy_from は次の項目のみをコピーします:
COPY と同じ URL スキーム とオプションをサポートしており、認証情報、format、圧縮、timeout、さらには明示的な structure まで、すべてそのまま利用できます。Postgres 側では、残った storage parameters がそのまま保持されます:
structure_from と copy_from はいずれも IF NOT EXISTS と併用できません。既存のリレーションを読み込むには COPY を使用してください。
制限事項
Postgres と chDB の間でのいくつかの既知の問題およびデータ型の挙動の違いにより、chdb_hook には以下の制限があります:- コピーを実行するロールに適用される row-level security policies が設定された relation は
COPYできません。Postgres はこうした policies を適用する際にCOPY TOをクエリへ書き換えますが、chdb_hook はこれをサポートしていません。 - ClickHouse には NULL の Array が存在しないため、
COPY TOはNULLを空の Array ([]) として格納します。 - ClickHouse は
lseg、path、polygonに相当するものを Array として表現します。そのため、これらの型の NULL 値もCOPY TOでは空の Array ([]) になります。 - 指定した structure でカラムが Nullable として定義されていない場合、NULL 値はそのデフォルト値として出力されます。この変換を避けるため、structure では nullable columns を必ず明示的に定義してください。
- 最後の点が最初の点と一致する開いた
pathは、閉じた path として出力されます。 - Protobuf の repeated field には null が存在しないため、Array 内の NULL 値は省略されます。
- chDB の JSON type は JSON オブジェクトのみをサポートします。
jsonおよびjsonbのデフォルトのStringマッピングをJSONで上書きするのは、すべての値が JSON オブジェクトである場合に限ってください。(ClickHouse/ClickHouse#68428) - chDB の JSON type は
nullを無視するため、NULL 値を持つオブジェクトのキーは出力時に省略されます。jsonおよびjsonbのデフォルトのStringマッピングをJSONで上書きするのは、オブジェクトの値がnullでない場合、またはその欠落が許容できる場合に限ってください。(ClickHouse/ClickHouse#68428) - JSON、JSONCompact、JSONColumnsWithMetadata フォーマットは常に UTF-8 を検証するため、bytea 値は replacement characters を含んだ形で出力されます。
COPY FROMは、空文字列またはゼロを含む Protobuf のNullableフィールドをNULLとして読み取ります。(chdb-io/chdb-core#152)- Parquet への
COPY TOは、Nullable Tuple 自身の null マップからNULLを削除します。(ClickHouse/ClickHouse#112427) - Parquet、Arrow、ArrowStream、ORC、Avro、Protobuf、ProtobufList、MsgPack、BSONEachRow の各フォーマットには、Postgres の
timeや chDB のTime64に対応する型がありません。値を保持するには、明示的な structure でtimeカラムをStringとして設定してください。 - Protobuf 出力では timestamp 値が秒単位に切り捨てられます。
- Protobuf 出力は 1970-01-01 より前の日付をサポートしません。値を保持するには、明示的な structure で
timeカラムをStringとして設定してください。(ClickHouse/ClickHouse#111860) - CSVWithNames および CSVWithNamesAndTypes フォーマットは、現時点では
NULLの box や circle の値をインポートできません。(ClickHouse/ClickHouse#115523)
データ型
COPY は relation の Postgres 型を chDB の型にマッピングし、 CREATE TABLE は URL の chDB 型を Postgres の型に マッピングします。Postgres から chDB へ
明示的な structure オプションが指定されていない場合、chdb_hook は Postgres の型を適切な chDB の同等な型にマッピングします。用途に合わない場合は、 structure を指定して、生成された型を必要な型でオーバーライドしてください。
Array 型は、マッピング後の要素型の
Array にマッピングされます。ClickHouse は
カラム単位で NULL 許容を制約しますが、Postgres は array 単位で制約するため、要素は
常に Nullable になります。
Map や Tuple にマッピングされる Postgres 型はありませんが、structure で
指定することは可能です。Map はキーと値のペアの array に変換でき、Tuple は
array に変換されます。異種混在のデータをサポートするには text[] を使用してください。
Timestamp 変換
プレーンテキストフォーマット (TSV、CSV など) では、COPY hook は現在の datestyle 設定に関係なく、DateTime および DateTime64 の値を ISO-8601 形式 (YYYY-MM-DDThh:mm:ssZ) で出力します。これにより、値をインポートする側が異なる time zone を使用していても、timestamptz の値は一貫して保たれます。structure の出力で Datetime64(3, 'America/Los_Angeles') のような別の型を指定しても、出力のオフセットには影響せず、精度のみが変わります。
Timestamp TZ の例:
また
COPY hook は、timestamp の値を session time zone から UTC へ変換し、その time zone を基準として出力されるようにします。新しいシステムに読み込まれた際には、そのシステムのローカル time zone に変換されます。したがって、time zone が異なれば値も異なりますが、time zone の差分を考慮すれば同一の時点を表します。
timezone 設定が timestamp 2026-08-28T12:00:00 に与える影響の例:
chDB から Postgres へ
chdb_hook は、DESCRIBE が報告する ClickHouse の型を、次の Postgres の型にマッピングします:
この表に記載されていない chDB の型は、
Nested、Variant、Dynamic を含めすべてエラーを送出します。これらをテキストとして読み取るには、String にマッピングする structure を使用してください。
Postgres が扱える範囲は、これらの型のいくつかにおいて chDB より狭くなっています。そのため、24 時間を超える Time や Time64、および Postgres の日付範囲外の Date32 については、コピー時にエラーが送出されます。
テキストエンコーディング
chDB はString、FixedString、Enum、JSON をバイト列として読み取るため、エンコーディングは保証されません。これらのカラムを text やその他の非バイナリ型へコピーする際には、バイト列がデータベースのエンコーディングに適合するかが検証され、表現できないデータに対してはエラーが送出されます:
text に NUL を格納できないためです。
chDB が書き込んだままのバイト列を保持するには bytea にコピーしてください。これらの型に対しては CREATE TABLE が text を導出するため、次のように名前を付けてください:
FixedString(N) は、短い値を NUL バイトで埋めます。text にコピーすると
末尾の NUL は削除されますが、bytea では N バイトすべてが保持されます。
設定
chdb_hook.max_memory
max_memory_usage 設定に反映されます。superuser 権限が必要です。メガバイト数を表す integer、または次のいずれかのメモリ単位を指定してください。
B(バイト)kB(キロバイト)MB(メガバイト)GB(ギガバイト)TB(テラバイト)
0 で、この場合メモリは制限されません。
chdb_hook.max_threads
max_threads 設定を指定するために使用します。superuser 権限が必要です。デフォルトは 0 で、この場合は chDB が値を決定します。
大規模な COPY を実行する前に chdb_hook.max_threads を設定することを強く推奨します。これにより、chDB が PostgreSQL を犠牲にして CPU を使い切ってしまうのを防げます。
chdb_hook.max_parsing_threads
max_parsing_threads 設定に使用されます。superuser 権限が必要です。デフォルトは 0 で、この場合は chDB が値を決定します。
大量のデータを COPY する前に chdb_hook.max_parsing_threads を設定し、chDB が PostgreSQL を犠牲にして CPU 使用率を使い切ってしまうことを防ぐことを推奨します。
Versioning Policy
chdb_hook は、公開リリースにおいて Semantic Versioning に準拠しています。- major version は API の変更時にインクリメントされます
- minor version は後方互換性のある SQL の変更時にインクリメントされます
- patch バージョンは binary のみの変更時にインクリメントされます
pg_get_loaded_modules() 関数で確認できます。