メインコンテンツへスキップ
Amazon S3 および Google Cloud Storage 内のファイルに対して SELECT/INSERT を行うためのテーブル形式インターフェイスを提供します。このテーブル関数は hdfs function に似ていますが、S3 固有の機能を備えています。 クラスター内に複数のレプリカがある場合は、代わりに s3Cluster function を使用して INSERT を並列化できます。 s3 table functionINSERT INTO...SELECT と併用すると、データはストリーミング方式で読み込まれ、挿入されます。S3 からブロックが継続的に読み込まれて宛先テーブルに送られるため、メモリ上に保持されるデータブロックはごく少数です。

構文

GCSS3 テーブル関数は、GCS XML API と HMAC キーを使用して Google Cloud Storage と連携できます。エンドポイントと HMAC の詳細については、Google の相互運用性に関するドキュメントを参照してください。GCS を使用する場合は、access_key_idsecret_access_key の箇所を、それぞれお使いの HMAC キーと HMAC シークレットに置き換えてください。
パラメーター s3 テーブル関数は、以下の通常のパラメーターをサポートします。
GCSGoogle XML API の endpoint は JSON API とは異なるため、GCS の URL は次の形式になります。
https://storage.cloud.google.com ではありません。
引数は、名前付きコレクションを使って渡すこともできます。この場合、urlaccess_key_idsecret_access_keyformatstructurecompression_method は同様に機能し、さらにいくつかの追加パラメーターをサポートします。

戻り値

指定したファイル内のデータの読み書きに使用する、指定した構造を持つテーブル。

S3 上のファイル https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv からテーブルの先頭 5 行を選択する例:
ClickHouse は、ファイル名の拡張子からデータのフォーマットを判別します。たとえば、前のコマンドは CSVWithNames を指定しなくても実行できました。
ClickHouse はファイルの圧縮方式も判別できます。たとえば、ファイル名が .csv.gz で終わっていれば、ClickHouse が自動的に展開します。
*.parquet.snappy*.parquet.zstd のような名前の Parquet ファイルは、ClickHouse が誤って解釈し、TOO_LARGE_COMPRESSED_BLOCKZSTD_DECODER_FAILED エラーの原因になることがあります。 これは、Parquet では実際には行グループ単位およびカラム単位で圧縮が行われているにもかかわらず、ClickHouse がファイル全体を Snappy または ZSTD でエンコードされたデータとして読み込もうとするためです。Parquet のメタデータには、各カラムの圧縮方式がすでに記録されているため、ファイル拡張子は不要です。 このような場合は、compression_method = 'none' を指定してください。

使用方法

S3上に以下のURIを持つ複数のファイルがあるとします: 1から3までの数字で終わるファイルの行数を数えます:
これら2つのディレクトリ内のすべてのファイルの合計行数を取得します:
ファイル一覧に先頭がゼロの数値範囲が含まれている場合は、各桁を個別に波括弧で指定するか、? を使用してください。
file-000.csvfile-001.csv、…、file-999.csv という名前のファイル内の総行数をカウントします:
test-data.csv.gz ファイルにデータを挿入します:
既存のテーブルからファイル test-data.csv.gz にデータを挿入する:
Glob ** を使用すると、ディレクトリを再帰的にトラバースできます。次の例では、my-test-bucket-768 ディレクトリからすべてのファイルを再帰的にフェッチします。
以下は、my-test-bucket ディレクトリ内の任意のフォルダにあるすべての test-data.csv.gz ファイルからデータを再帰的に取得します:
注意: サーバー設定ファイルにカスタムURLマッパーを指定できます。例:
URL 's3://clickhouse-public-datasets/my-test-bucket-768/**/test-data.csv.gz''http://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/**/test-data.csv.gz' に変換されます。 カスタムマッパーは config.xml に追加できます:
本番環境で利用する場合は、名前付きコレクション の使用を推奨します。以下に例を示します。

パーティション分割書き込み

パーティション方式

INSERTクエリでのみサポートされます。 WILDCARD (デフォルト) : ファイルパス内の{_partition_id}ワイルドカードを実際のパーティションキーに置き換えます。 HIVEは、読み取りと書き込みで Hive スタイルのパーティション化を行います。ファイルは次のフォーマットで生成されます: <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)> HIVEパーティション方式の例
WILDCARD パーティション方式の例
  1. キーにパーティション ID を使用すると、ファイルが個別に作成されます。
その結果、データは file_x.csvfile_y.csvfile_z.csv の3つのファイルに書き込まれます。
  1. バケット名にパーティション ID を含めると、別々のバケットにファイルが作成されます。
その結果、データは異なるバケット内の3つのファイル、my_bucket_1/file.csvmy_bucket_10/file.csvmy_bucket_20/file.csv に書き込まれます。

公開バケットへのアクセス

ClickHouse は、さまざまなソースから認証情報を取得しようとします。 そのため、公開バケットによってはアクセス時に問題が発生し、クライアントが 403 エラーコードを返すことがあります。 この問題は、NOSIGN キーワードを使用してクライアントがすべての認証情報を無視し、リクエストに署名しないようにすることで回避できます。

S3認証情報の使用 (ClickHouse Cloud)

公開されていないバケットでは、aws_access_key_idaws_secret_access_key を関数に渡すことができます。例:
これは、一時的なアクセスや、認証情報を容易にローテーションできる場合に適しています。ただし、長期にわたって繰り返しアクセスする用途や、認証情報の機密性が高い場合には推奨されません。そのような場合は、role-based access を使用することを推奨します。 ClickHouse Cloud での S3 の role-based access については、こちらを参照してください。 設定後は、roleARNextra_credentials パラメータ経由で s3 function に渡せます。例:
さらに詳しい例はこちらをご覧ください

アーカイブの扱い

S3 上に、次の URI を持つ複数のアーカイブファイルがあるとします。 :: を使うと、これらのアーカイブからデータを抽出できます。グロブは URL 部分と、:: の後の部分 (アーカイブ内のファイル名を指定する部分) の両方で使用できます。
ClickHouse は、次の 3 つのアーカイブフォーマットをサポートしています。 ZIP TAR 7Z ZIP アーカイブと TAR アーカイブはサポート対象の任意のストレージからアクセスできますが、7Z アーカイブは ClickHouse がインストールされているローカルのファイルシステムからのみ読み取れます。

データの挿入

行を挿入できるのは新しいファイルに対してのみである点に注意してください。マージサイクルやファイルの分割処理はありません。いったんファイルが書き込まれると、その後の挿入は失敗します。詳細はこちらを参照してください。

仮想カラム

  • _path — ファイルのパス。Type: LowCardinality(String)。アーカイブの場合は、"{path_to_archive}::{path_to_file_inside_archive}" 形式のパスを表示します。
  • _file — ファイル名。Type: LowCardinality(String)。アーカイブの場合は、アーカイブ内のファイル名を表示します。
  • _size — ファイルサイズ (バイト単位) 。Type: Nullable(UInt64)。ファイルサイズが不明な場合、値は NULL です。アーカイブの場合は、アーカイブ内のファイルの非圧縮サイズを表示します。
  • _time — ファイルの最終更新時刻。Type: Nullable(DateTime)。時刻が不明な場合、値は NULL です。

use_hive_partitioning 設定

これは、読み取り時に ClickHouse が Hive スタイルでパーティション化されたファイルを解析するためのヒントです。書き込みには影響しません。読み取りと書き込みを対称的に行うには、partition_strategy 引数を使用してください。 use_hive_partitioning を 1 に設定すると、ClickHouse はパス (/name=value/) 内の Hive スタイルのパーティション化を検出し、クエリ内でパーティションカラムを仮想カラムとして使用できるようになります。これらの仮想カラムには、パーティション化されたパス内と同じ名前が付きます。

requester-pays バケットへのアクセス

requester-pays バケットにアクセスするには、すべてのリクエストにヘッダー x-amz-request-payer = requester を含める必要があります。これを行うには、s3関数にパラメーター headers('x-amz-request-payer' = 'requester') を渡します。例:

ストレージ設定

  • s3_truncate_on_insert - ファイルに insert する前に、そのファイルを切り詰めることを許可します。デフォルトでは無効です。
  • s3_create_new_file_on_insert - フォーマットに接尾辞がある場合、insert のたびに新しいファイルを作成することを許可します。デフォルトでは無効です。
  • s3_skip_empty_files - 読み取り時に空のファイルをスキップすることを許可します。デフォルトでは有効です。

ネストされた Avro スキーマ

ファイルごとに構造が異なるネストされたレコードを含む Avro ファイルを読み込むと (たとえば、一部のファイルではネストされたオブジェクト内に追加のフィールドがある場合) 、ClickHouse は次のようなエラーを返すことがあります。
record の leaf 数が tuple の要素数と一致しません…
これは、ClickHouse がすべてのネストされたレコード構造に同一のスキーマを期待しているためです。 このような場合は、次のいずれかの方法で対応できます。
  • schema_inference_mode='union' を使用して、異なるネストされたレコードのスキーマをマージする、または
  • ネストされた構造を手動で揃えたうえで、 use_structure_from_insertion_table_in_table_functions=1 を有効にする。
パフォーマンスに関する注意schema_inference_mode='union' は、スキーマを推論するために各ファイルをスキャンする必要があるため、非常に大規模な S3 データセットでは時間がかかる場合があります。
最終更新日 2026年6月19日