s3 テーブル関数
AWS S3 および Google Cloud Storage からファイルを選択/挿入するためのテーブルライクなインターフェースを提供します。このテーブル関数は hdfs 関数 に似ていますが、S3 特有の機能を提供します。
クラスターに複数のレプリカがある場合は、s3Cluster 関数 を代わりに使用して、挿入を並行化することができます。
s3 テーブル関数
を INSERT INTO...SELECT
と共に使用すると、データはストリーミング方式で読み取りおよび挿入されます。データのブロックが連続的に S3 から読み取られ、宛先テーブルにプッシュされる間、メモリ内にはわずかにブロックデータが存在します。
構文
S3 テーブル関数は、GCS XML API と HMAC キーを使用して Google Cloud Storage と統合されます。エンドポイントと HMAC に関する詳細については、Google 互換性ドキュメント を参照してください。
GCS では、access_key_id
および secret_access_key
の場所に HMAC キーおよび HMAC シークレットを置き換えてください。
パラメータ
s3
テーブル関数は、以下のプレーンパラメータをサポートしています。
パラメータ | 説明 |
---|---|
url | ファイルへのパスを含むバケットの URL。読み取り専用モードでサポートされるワイルドカード: * 、** 、? 、{abc,def} および {N..M} (ここで N 、M は数字、'abc' 、'def' は文字列)。詳細は こちら を参照してください。 |
NOSIGN | このキーワードが資格情報の代わりに提供されると、すべてのリクエストが署名されなくなります。 |
access_key_id と secret_access_key | 指定したエンドポイントで使用する資格情報を指定するキー。オプションです。 |
session_token | 指定されたキーで使用するセッショントークン。キーを渡すときはオプションです。 |
format | ファイルの フォーマット。 |
structure | テーブルの構造。フォーマットは 'column1_name column1_type, column2_name column2_type, ...' 。 |
compression_method | パラメータはオプションです。サポートされる値: none 、gzip または gz 、brotli または br 、xz または LZMA 、zstd または zst 。デフォルトでは、ファイル拡張子によって圧縮方法が自動検出されます。 |
headers | パラメータはオプションです。S3 リクエストにヘッダーを渡すことを許可します。フォーマットは headers(key=value) (例: headers('x-amz-request-payer' = 'requester') )です。 |
GCS URL は、このフォーマットであり、Google XML API のエンドポイントは JSON API とは異なります:
であり、https://storage.cloud.google.com ではありません。
引数は named collections を使用しても渡すことができます。この場合、url
、access_key_id
、secret_access_key
、format
、structure
、compression_method
は同じように機能し、いくつかの追加パラメータがサポートされます:
引数 | 説明 |
---|---|
filename | 指定された場合、URL に追加されます。 |
use_environment_credentials | デフォルトで有効で、環境変数 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 、AWS_CONTAINER_CREDENTIALS_FULL_URI 、AWS_CONTAINER_AUTHORIZATION_TOKEN 、AWS_EC2_METADATA_DISABLED を使用して追加パラメータを渡すことを許可します。 |
no_sign_request | デフォルトでは無効です。 |
expiration_window_seconds | デフォルト値は 120 です。 |
戻り値
指定されたファイルでデータを読み書きするための指定した構造のテーブル。
例
S3 ファイル https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv
から最初の 5 行を選択します:
ClickHouse はファイルのフォーマットを決定するためにファイル名の拡張子を使用します。たとえば、以前のコマンドを CSVWithNames
なしで実行することも可能です:
ClickHouse もファイルの圧縮方法を自動的に判断できます。たとえば、ファイルが .csv.gz
拡張子で圧縮されている場合、ClickHouse は自動的にファイルを解凍します。
使用方法
次の URI を持ついくつかのファイルが S3 にあるとします:
- '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/some_prefix/some_file_4.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'
- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_4.csv'
1 から 3 までの数字で終わるファイルの行数をカウントします:
これら二つのディレクトリ内のすべてのファイルの行数をカウントします:
ファイルのリストに先頭ゼロを持つ番号範囲が含まれている場合は、各桁ごとにブレースを使用する構文を使用するか、?
を使用してください。
file-000.csv
、file-001.csv
、...、file-999.csv
という名前のファイルの行数をカウントします:
ファイル test-data.csv.gz
にデータを挿入します:
既存のテーブルからファイル test-data.csv.gz
にデータを挿入します:
グロブ ** を使用すると、再帰的なディレクトリトラバーサルが可能です。以下の例を考えてみると、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
に追加できます:
本番の使用ケースには、named collections の使用を推奨します。以下は例です:
パーティション化された書き込み
S3 テーブルにデータを挿入する際に PARTITION BY
式を指定すると、各パーティション値ごとに個別のファイルが作成されます。データを個別のファイルに分割することで、読み取り操作の効率が向上します。
例
- キーにパーティション ID を使用すると、別々のファイルが作成されます:
その結果、データは file_x.csv
、file_y.csv
、file_z.csv
の3つのファイルに書き込まれます。
- バケット名にパーティション ID を使用すると、異なるバケットにファイルが作成されます:
その結果、データは異なるバケットにある3つのファイルに書き込まれます: my_bucket_1/file.csv
、my_bucket_10/file.csv
、my_bucket_20/file.csv
。
パブリックバケットへのアクセス
ClickHouse は、さまざまなタイプのソースから資格情報を取得しようとします。そのため、クライアントが 403
エラーコードを返す原因となることがあります。これは、パブリックバケットへのアクセス時に問題を引き起こす場合があります。この問題は、NOSIGN
キーワードを使用して回避でき、クライアントにすべての資格情報を無視させ、リクエストに署名しないようにします。
S3 資格情報の使用 (ClickHouse Cloud)
非公開バケットの場合、ユーザーは関数に aws_access_key_id
および aws_secret_access_key
を渡すことができます。たとえば:
これは、一回限りのアクセスや資格情報を簡単にローテーションできる場合には適しています。しかし、繰り返しのアクセスや、資格情報が機密である場合においては長期的な解決策としては推奨されません。この場合、ユーザーには役割に基づくアクセスを依存することをお勧めします。
ClickHouse Cloud の S3 に対する役割に基づくアクセスは こちら でドキュメント化されています。
構成が完了すると、roleARN
を extra_credentials
パラメーター経由で s3 関数に渡すことができます。たとえば:
さらに例は こちら で見つけることができます。
アーカイブ作業
S3 にある次の URI を持ついくつかのアーカイブファイルがあるとします:
- 'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-10.csv.zip'
- 'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-11.csv.zip'
- 'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip'
これらのアーカイブからデータを抽出するには、:: を使用します。グロブは URL 部分と :: の後の部分(アーカイブ内のファイル名を示す)の両方で使用できます。
ClickHouse では、3 つのアーカイブ形式をサポートしています: ZIP TAR 7Z ZIP および TAR アーカイブは、サポートされている任意のストレージロケーションからアクセスできますが、7Z アーカイブは ClickHouse がインストールされているローカルファイルシステムからのみ読み取ることができます。
データの挿入
新しいファイルのみに行を挿入できることに注意してください。マージサイクルやファイル分割操作はありません。一度ファイルが書き込まれると、以降の挿入は失敗します。詳細は こちら を参照してください。
仮想カラム
_path
— ファイルへのパス。タイプ:LowCardinality(String)
。アーカイブの場合、フォーマットが"{path_to_archive}::{path_to_file_inside_archive}"
で表示されます。_file
— ファイル名。タイプ:LowCardinality(String)
。アーカイブの場合、アーカイブ内のファイル名が表示されます。_size
— ファイルのサイズ(バイト単位)。タイプ:Nullable(UInt64)
。ファイルサイズが不明な場合、値はNULL
になります。アーカイブの場合、アーカイブ内のファイルの未圧縮ファイルサイズが表示されます。_time
— ファイルの最終更新時刻。タイプ:Nullable(DateTime)
。時刻が不明な場合、値はNULL
になります。
Hive スタイルのパーティショニング
use_hive_partitioning
を 1 に設定すると、ClickHouse はパス内の Hive スタイルのパーティショニングを検出し (/name=value/
)、クエリ内でパーティションカラムを仮想カラムとして使用することを許可します。これらの仮想カラムは、パーティション付きのパスと同じ名前ですが、_
で始まります。
例
Hive スタイルのパーティショニングを使用して作成された仮想カラムを使用する
リクエスターペイバケットへのアクセス
リクエスターペイバケットにアクセスするには、リクエスト内に x-amz-request-payer = requester
ヘッダーを渡す必要があります。これは、s3 関数に headers('x-amz-request-payer' = 'requester')
パラメータを渡すことで達成されます。例:
ストレージ設定
- s3_truncate_on_insert - 挿入前にファイルをトランケートすることを許可します。デフォルトでは無効です。
- s3_create_new_file_on_insert - フォーマットにサフィックスがある場合、各挿入時に新しいファイルを作成することを許可します。デフォルトでは無効です。
- s3_skip_empty_files - 読み取り中に空のファイルをスキップすることを許可します。デフォルトでは有効です。