メインコンテンツへスキップ
このエンジンは Amazon S3 エコシステムとのインテグレーションを提供します。HDFS エンジンと似ていますが、S3 固有の機能を備えています。

CREATE TABLE s3_engine_table (name String, value UInt32)
    ENGINE=S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/test-data.csv.gz', 'CSV', 'gzip')
    SETTINGS input_format_with_names_use_header = 0;

INSERT INTO s3_engine_table VALUES ('one', 1), ('two', 2), ('three', 3);

SELECT * FROM s3_engine_table LIMIT 2;
┌─name─┬─value─┐
│ one  │     1 │
│ two  │     2 │
└──────┴───────┘

テーブルを作成する

CREATE TABLE s3_engine_table (name String, value UInt32)
    ENGINE = S3(path [, NOSIGN | aws_access_key_id, aws_secret_access_key,] format, [compression], [partition_strategy], [partition_columns_in_data_file], [extra_credentials])
    [PARTITION BY expr]
    [SETTINGS ...]

エンジンパラメータ

  • path — ファイルへのパスを含むバケット URL。readonly モードでは、次のワイルドカードをサポートします: *, **, ?, {abc,def} および {N..M}。ここで、N, M は数値、'abc', 'def' は文字列です。詳細は以下を参照してください。
  • NOSIGN - 認証情報の代わりにこのキーワードを指定すると、すべてのリクエストに署名が行われません。
  • format — ファイルのフォーマット
  • aws_access_key_id, aws_secret_access_key - AWS アカウントユーザー向けの長期認証情報です。これらを使用してリクエストを認証できます。このパラメータは任意です。認証情報が指定されていない場合は、設定ファイルのものが使用されます。詳細は Using S3 for Data Storage を参照してください。
  • compression — 圧縮タイプ。サポートされる値: none, gzip/gz, brotli/br, xz/LZMA, zstd/zst。このパラメータは任意です。デフォルトでは、ファイル拡張子から圧縮方式を自動検出します。
  • partition_strategy – オプション: WILDCARD または HIVEWILDCARD では、パス内に {_partition_id} が必要で、これがパーティションキーに置き換えられます。HIVE ではワイルドカードは使用できず、パスがテーブルのルートであるとみなし、ファイル名に Snowflake ID、拡張子にファイルフォーマットを使用した Hive スタイルのパーティションディレクトリを生成します。デフォルトは WILDCARD です
  • partition_columns_in_data_file - HIVE パーティション方式でのみ使用されます。データファイル内にパーティションカラムが書き込まれているものとして ClickHouse が扱うかどうかを指定します。デフォルトは false です。
  • storage_class_name - オプション: STANDARD または INTELLIGENT_TIERINGAWS S3 Intelligent Tiering を指定できます。
  • extra_credentials - 任意。ClickHouse Cloud でロールベースアクセス用の role_arn を渡すために使用します。設定手順については Secure S3 を参照してください。

データキャッシュ

S3 テーブルエンジンは、ローカルディスクへのデータキャッシュをサポートしています。 ファイルシステムキャッシュの設定オプションと使用方法については、このセクションを参照してください。 キャッシュはストレージオブジェクトのパスと ETag に基づいて行われるため、ClickHouse が古いキャッシュを読み込むことはありません。 キャッシュを有効にするには、設定 filesystem_cache_name = '<name>'enable_filesystem_cache = 1 を使用します。
SELECT *
FROM s3('http://minio:10000/clickhouse//test_3.csv', 'minioadmin', 'minioadminpassword', 'CSV')
SETTINGS filesystem_cache_name = 'cache_for_s3', enable_filesystem_cache = 1;
設定ファイルでcacheを定義する方法は2つあります。
  1. ClickHouseの設定ファイルに次のセクションを追加します。
<clickhouse>
    <filesystem_caches>
        <cache_for_s3>
            <path>path to cache directory</path>
            <max_size>10Gi</max_size>
        </cache_for_s3>
    </filesystem_caches>
</clickhouse>
  1. ClickHouse の storage_configuration セクションにある cache の設定 (つまり cache ストレージ) を再利用します。詳しくはこちらを参照してください

PARTITION BY

PARTITION BY — 任意です。ほとんどの場合、パーティションキーは不要です。必要な場合でも、通常は月単位より細かいパーティションキーは必要ありません。パーティション化してもクエリは高速化されません (ORDER BY 式とは対照的です) 。細かすぎるパーティション化は絶対に避けてください。クライアント識別子や名前でデータをパーティション化しないでください (代わりに、クライアント識別子または名前を ORDER BY 式の最初のカラムにしてください) 。 月単位でパーティション化するには、toYYYYMM(date_column) 式を使用します。ここで、date_columnDate 型の日付カラムです。ここでのパーティション名は "YYYYMM" フォーマットになります。

パーティション方式

WILDCARD (デフォルト) : ファイルパス内の {_partition_id} ワイルドカードを実際のパーティションキーに置き換えます。読み取りはサポートされていません。 HIVE は、読み取りと書き込みで Hive スタイルのパーティション化を実装します。読み取りは再帰的な glob パターンを使用して実装されており、SELECT * FROM s3('table_root/**.parquet') と同等です。 書き込みでは、次のフォーマットでファイルが生成されます: <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)> 注: HIVE パーティション方式を使用する場合、use_hive_partitioning 設定は効果がありません。 HIVE パーティション方式の例:
arthur :) CREATE TABLE t_03363_parquet (year UInt16, country String, counter UInt8)
ENGINE = S3(s3_conn, filename = 't_03363_parquet', format = Parquet, partition_strategy='hive')
PARTITION BY (year, country);

arthur :) INSERT INTO t_03363_parquet VALUES
    (2022, 'USA', 1),
    (2022, 'Canada', 2),
    (2023, 'USA', 3),
    (2023, 'Mexico', 4),
    (2024, 'France', 5),
    (2024, 'Germany', 6),
    (2024, 'Germany', 7),
    (1999, 'Brazil', 8),
    (2100, 'Japan', 9),
    (2024, 'CN', 10),
    (2025, '', 11);

arthur :) select _path, * from t_03363_parquet;

    ┌─_path──────────────────────────────────────────────────────────────────────┬─year─┬─country─┬─counter─┐
 1. │ test/t_03363_parquet/year=2100/country=Japan/7329604473272971264.parquet2100 │ Japan   │       9
 2. │ test/t_03363_parquet/year=2024/country=France/7329604473323302912.parquet2024 │ France  │       5
 3. │ test/t_03363_parquet/year=2022/country=Canada/7329604473314914304.parquet2022 │ Canada  │       2
 4. │ test/t_03363_parquet/year=1999/country=Brazil/7329604473289748480.parquet1999 │ Brazil  │       8
 5. │ test/t_03363_parquet/year=2023/country=Mexico/7329604473293942784.parquet2023 │ Mexico  │       4
 6. │ test/t_03363_parquet/year=2023/country=USA/7329604473319108608.parquet2023 │ USA     │       3
 7. │ test/t_03363_parquet/year=2025/country=/7329604473327497216.parquet2025 │         │      11
 8. │ test/t_03363_parquet/year=2024/country=CN/7329604473310720000.parquet2024 │ CN      │      10
 9. │ test/t_03363_parquet/year=2022/country=USA/7329604473298137088.parquet2022 │ USA     │       1
10. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet2024 │ Germany │       6
11. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet2024 │ Germany │       7
    └────────────────────────────────────────────────────────────────────────────┴──────┴─────────┴─────────┘

パーティション化されたデータのクエリ

この例では、ClickHouse と MinIO を統合する docker compose recipe を使用します。エンドポイントと認証の値を置き換えれば、S3 を使って同じクエリを再現できるはずです。 ENGINE 設定の S3 エンドポイントでは、S3 オブジェクト (ファイル名) の一部としてパラメータートークン {_partition_id} が使われており、SELECT クエリでは生成されたそのオブジェクト名 (例: test_3.csv) を対象にしている点に注目してください。
この例が示すように、パーティション化された S3 テーブルに対するクエリは 現時点では直接サポートされていませんが、各パーティションに対して S3 テーブル関数 を使ってクエリすることで実現できます。S3 への パーティション化されたデータの書き込みの主な用途は、そのデータを別の ClickHouse システムへ転送できるようにすることです (たとえば、オンプレミス環境から ClickHouse Cloud へ移行する場合など) 。ClickHouse のデータセットは非常に大きくなることが多く、またネットワークの 信頼性も常に十分とは限らないため、データセットを 一部ずつ転送できるようにしておくのが合理的です。これが、パーティション化書き込みを行う理由です。

テーブルを作成

CREATE TABLE p
(
    `column1` UInt32,
    `column2` UInt32,
    `column3` UInt32
)
ENGINE = S3(
           'http://minio:10000/clickhouse//test_{_partition_id}.csv',
           'minioadmin',
           'minioadminpassword',
           'CSV')
PARTITION BY column3

データを挿入する

INSERT INTO p VALUES (1, 2, 3), (3, 2, 1), (78, 43, 45)

パーティション 3 から取得

このクエリでは S3 テーブル関数を使用します
SELECT *
FROM s3('http://minio:10000/clickhouse//test_3.csv', 'minioadmin', 'minioadminpassword', 'CSV')
┌─c1─┬─c2─┬─c3─┐
│  1 │  2 │  3 │
└────┴────┴────┘

パーティション 1 からの選択

SELECT *
FROM s3('http://minio:10000/clickhouse//test_1.csv', 'minioadmin', 'minioadminpassword', 'CSV')
┌─c1─┬─c2─┬─c3─┐
│  3 │  2 │  1 │
└────┴────┴────┘

パーティション45から選択する

SELECT *
FROM s3('http://minio:10000/clickhouse//test_45.csv', 'minioadmin', 'minioadminpassword', 'CSV')
┌─c1─┬─c2─┬─c3─┐
│ 78 │ 43 │ 45 │
└────┴────┴────┘

制限

つい Select * from p を試したくなるかもしれませんが、前述のとおり、このクエリは失敗します。代わりに、前のクエリを使用してください。
SELECT * FROM p
Received exception from server (version 23.4.1):
Code: 48. DB::Exception: Received from localhost:9000. DB::Exception: Reading from a partitioned S3 storage is not implemented yet. (NOT_IMPLEMENTED)

データの挿入

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

仮想カラム

  • _path — ファイルのパス。型: LowCardinality(String).
  • _file — ファイル名。型: LowCardinality(String).
  • _size — ファイルのサイズ (バイト単位) 。型: Nullable(UInt64). サイズが不明な場合、値は NULL です。
  • _time — ファイルの最終更新時刻。型: Nullable(DateTime). 時刻が不明な場合、値は NULL です。
  • _etag — ファイルの ETag。型: LowCardinality(String). ETag が不明な場合、値は NULL です。
  • _tags — ファイルのタグ。型: Map(String, String). タグが存在しない場合、値は空のマップ `’ です。
仮想カラムの詳細については、こちらを参照してください。

実装の詳細

  • 読み取りと書き込みは並行して実行できます
  • サポートされていません:
    • ALTER および SELECT...SAMPLE 操作。
    • 索引。
    • Zero-copy レプリケーションは可能ですが、サポート対象外です。
ゼロコピー レプリケーションは本番環境には未対応ですゼロコピー レプリケーションは、ClickHouse バージョン 22.8 以降ではデフォルトで無効になっています。この機能を本番環境で使用することは推奨されません。

path 内のワイルドカード

path 引数では、bash 形式のワイルドカードを使って複数のファイルを指定できます。処理対象のファイルは実在し、path パターン全体に一致している必要があります。ファイルの一覧は SELECT の実行時に決定されます (CREATE 時ではありません) 。
  • * — 空文字列を含む、/ を除く任意の文字列に置き換えられます。
  • ** — 空文字列を含む、/ を含む任意の文字列に置き換えられます。
  • ? — 任意の 1 文字に置き換えられます。
  • {some_string,another_string,yet_another_one}'some_string''another_string''yet_another_one' のいずれかの文字列に置き換えられます。
  • {N..M} — N から M までの範囲内の任意の数値 (両端を含む) に置き換えられます。N と M には先頭の 0 を付けることもできます (例: 000..078) 。
{} を使う構文は、remote table function と似ています。
ファイル一覧に先頭の 0 を含む数値範囲がある場合は、各桁ごとに波かっこを使った構文を使用するか、? を使用してください。
ワイルドカードの例 1 file-000.csvfile-001.csv、…、file-999.csv という名前のファイルに対するテーブルを作成します:
CREATE TABLE big_table (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/my_folder/file-{000..999}.csv', 'CSV');
ワイルドカードを使った例 2 S3 上に、以下の URI を持つ CSV フォーマットのファイルが複数あるとします。 これら 6 つすべてのファイルからなるテーブルを作成する方法はいくつかあります。
  1. ファイル名の接尾辞の範囲を指定します。
CREATE TABLE table_with_range (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/some_file_{1..3}', 'CSV');
  1. some_file_ プレフィックスを持つすべてのファイルを対象にします (どちらのフォルダーにも、このプレフィックスを持つ余分なファイルがあってはいけません) :
CREATE TABLE table_with_question_mark (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/some_file_?', 'CSV');
  1. 両方のフォルダ内にあるすべてのファイルを対象とします (すべてのファイルは、クエリで記述されたフォーマットとスキーマに適合している必要があります) :
CREATE TABLE table_with_asterisk (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/*', 'CSV');

ストレージ設定

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

S3 関連の設定

以下の設定は、クエリの実行前に指定するか、設定ファイルに記述できます。
  • s3_max_single_part_upload_size — S3 へのシングルパートアップロードでアップロードするオブジェクトの最大サイズです。デフォルト値は 32Mb です。
  • s3_min_upload_part_sizeS3 Multipart upload を使用したマルチパートアップロード時にアップロードするパートの最小サイズです。デフォルト値は 16Mb です。
  • s3_max_redirects — 許可される S3 リダイレクトホップの最大数です。デフォルト値は 10 です。
  • s3_single_read_retries — 単一読み取り時の最大再試行回数です。デフォルト値は 4 です。
  • s3_max_put_rps — スロットリングが適用されるまでの PUT リクエストの最大毎秒レートです。デフォルト値は 0 (無制限) です。
  • s3_max_put_burst — 1 秒あたりのリクエスト制限に達する前に同時に発行できる最大リクエスト数です。デフォルトでは (値が 0 の場合) 、s3_max_put_rps と同じです。
  • s3_max_get_rps — スロットリングが適用されるまでの GET リクエストの最大毎秒レートです。デフォルト値は 0 (無制限) です。
  • s3_max_get_burst — 1 秒あたりのリクエスト制限に達する前に同時に発行できる最大リクエスト数です。デフォルトでは (値が 0 の場合) 、s3_max_get_rps と同じです。
  • s3_upload_part_size_multiply_factor - S3 への 1 回の書き込みで s3_multiply_parts_count_threshold 個のパートがアップロードされるたびに、s3_min_upload_part_size にこの係数を掛けます。デフォルト値は 2 です。
  • s3_upload_part_size_multiply_parts_count_threshold - この数のパートが S3 にアップロードされるたびに、s3_min_upload_part_sizes3_upload_part_size_multiply_factor 倍になります。デフォルト値は 500 です。
  • s3_max_inflight_parts_for_one_file - 1 つのオブジェクトに対して同時実行できる PUT リクエスト数を制限します。この数は制限する必要があります。値 0 は無制限を意味します。デフォルト値は 20 です。各進行中のパートには、最初の s3_upload_part_size_multiply_factor 個のパートについてはサイズ s3_min_upload_part_size のバッファが割り当てられ、ファイルが十分に大きい場合はさらに大きくなります。upload_part_size_multiply_factor を参照してください。デフォルト設定では、アップロードされる 1 ファイルあたりの消費量は、8G 未満のファイルで 320Mb を超えません。より大きなファイルでは消費量は増加します。
セキュリティ上の注意: 悪意のあるユーザーが任意の S3 URL を指定できる場合、SSRF 攻撃を防ぐために s3_max_redirects を 0 に設定する必要があります。あるいは、サーバー設定で remote_host_filter を指定する必要があります。

エンドポイントベースの設定

以下の設定は、指定したエンドポイントに対して設定ファイルで指定できます (URL のプレフィックスに完全一致するものが対象です) 。
  • endpoint — エンドポイントのプレフィックスを指定します。必須です。
  • access_key_id and secret_access_key — 指定したエンドポイントで使用する認証情報を指定します。任意です。
  • use_environment_credentialstrue に設定すると、S3 クライアントは指定したエンドポイントについて、環境変数および Amazon EC2 のメタデータから認証情報の取得を試みます。任意で、デフォルト値は false です。
  • region — S3 のリージョン名を指定します。任意です。
  • use_insecure_imds_requesttrue に設定すると、S3 クライアントは Amazon EC2 メタデータから認証情報を取得する際に、安全でない IMDS リクエストを使用します。任意で、デフォルト値は false です。
  • expiration_window_seconds — 有効期限付き認証情報が期限切れかどうかを確認する際の猶予期間です。任意で、デフォルト値は 120 です。
  • no_sign_request - すべての認証情報を無視し、リクエストに署名しないようにします。公開 bucket へのアクセスに便利です。
  • header — 指定したエンドポイントへのリクエストに、指定した HTTP ヘッダーを追加します。任意で、複数回指定できます。
  • access_header - 他のソースから認証情報が提供されていない場合に、指定したエンドポイントへのリクエストに指定した HTTP ヘッダーを追加します。
  • server_side_encryption_customer_key_base64 — 指定すると、SSE-C で暗号化された S3 object にアクセスするために必要なヘッダーが設定されます。任意です。
  • server_side_encryption_kms_key_id - 指定すると、SSE-KMS encryption で暗号化された S3 object にアクセスするために必要なヘッダーが設定されます。空文字列を指定した場合は、AWS 管理の S3 key が使用されます。任意です。
  • server_side_encryption_kms_encryption_context - server_side_encryption_kms_key_id とあわせて指定すると、SSE-KMS 用の指定した暗号化コンテキストヘッダーが設定されます。任意です。
  • server_side_encryption_kms_bucket_key_enabled - server_side_encryption_kms_key_id とあわせて指定すると、SSE-KMS 用の S3 bucket key を有効にするヘッダーが設定されます。任意で、true または false を指定できます。デフォルトでは何も設定されず、bucket レベルの設定に従います。
  • max_single_read_retries — 1 回の読み取りでの最大再試行回数です。デフォルト値は 4 です。任意です。
  • max_put_rps, max_put_burst, max_get_rps and max_get_burst - クエリ単位ではなく、特定のエンドポイントに対して使用するスロットリング設定です (説明は上記を参照) 。任意です。
例:
<s3>
    <endpoint-name>
        <endpoint>https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/</endpoint>
        <!-- <access_key_id>ACCESS_KEY_ID</access_key_id> -->
        <!-- <secret_access_key>SECRET_ACCESS_KEY</secret_access_key> -->
        <!-- <region>us-west-1</region> -->
        <!-- <use_environment_credentials>false</use_environment_credentials> -->
        <!-- <use_insecure_imds_request>false</use_insecure_imds_request> -->
        <!-- <expiration_window_seconds>120</expiration_window_seconds> -->
        <!-- <no_sign_request>false</no_sign_request> -->
        <!-- <header>Authorization: Bearer SOME-TOKEN</header> -->
        <!-- <server_side_encryption_customer_key_base64>BASE64-ENCODED-KEY</server_side_encryption_customer_key_base64> -->
        <!-- <server_side_encryption_kms_key_id>KMS_KEY_ID</server_side_encryption_kms_key_id> -->
        <!-- <server_side_encryption_kms_encryption_context>KMS_ENCRYPTION_CONTEXT</server_side_encryption_kms_encryption_context> -->
        <!-- <server_side_encryption_kms_bucket_key_enabled>true</server_side_encryption_kms_bucket_key_enabled> -->
        <!-- <max_single_read_retries>4</max_single_read_retries> -->
    </endpoint-name>
</s3>

アーカイブの操作

S3 上に次の URI を持つ複数のアーカイブファイルがあるとします。 これらのアーカイブからデータを抽出するには :: を使用できます。グロブは URL 部分と、:: の後の部分 (アーカイブ内のファイル名を指定する部分) の両方で使用できます。
SELECT *
FROM s3(
   'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-1{0..2}.csv.zip :: *.csv'
);
ClickHouse は次の 3 つのアーカイブフォーマットをサポートしています: ZIP TAR 7Z ZIP アーカイブと TAR アーカイブには、サポートされている任意のストレージ上の場所からアクセスできますが、7Z アーカイブを読み取れるのは、ClickHouse がインストールされているローカルファイルシステム上からのみです。

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

ClickHouse は、さまざまな種類のソースから認証情報を取得しようとします。 そのため、公開バケットによってはアクセス時に問題が発生し、クライアントが 403 エラーコードを返すことがあります。 この問題は、NOSIGN キーワードを使用してクライアントがすべての認証情報を無視し、リクエストに署名しないようにすることで回避できます。
CREATE TABLE big_table (name String, value UInt32)
    ENGINE = S3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv', NOSIGN, 'CSVWithNames');

パフォーマンスの最適化

s3関数のパフォーマンス最適化の詳細については、詳しいガイドを参照してください。

ロールベースのアクセス

ClickHouse Cloud では、アクセスキーの代わりにロールベースのアクセスを使用して S3 に認証できます。設定手順については、Secure S3 を参照してください。 設定後は、extra_credentials パラメーターで roleARN を渡せます。
CREATE TABLE my_s3_table(name String, value UInt32)
ENGINE = S3('https://my-bucket.s3.amazonaws.com/data/*.csv', extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001'), 'CSV')

関連項目

最終更新日 2026年6月10日