s3 table function を INSERT INTO...SELECT と併用すると、データはストリーミング方式で読み込まれ、挿入されます。S3 からブロックが継続的に読み込まれて宛先テーブルに送られるため、メモリ上に保持されるデータブロックはごく少数です。
構文
s3 テーブル関数は、以下の通常のパラメーターをサポートします。
| パラメーター | 説明 |
|---|---|
url | ファイルへのパスを含むバケット URL。読み取り専用モードでは、*、**、?、{abc,def}、{N..M} のワイルドカードをサポートします。ここで、N と M は数値、'abc' と 'def' は文字列です。詳細はこちらを参照してください。 |
NOSIGN | 認証情報の代わりにこのキーワードを指定すると、すべてのリクエストが署名なしで送信されます。 |
access_key_id and secret_access_key | 指定した endpoint で使用する認証情報を指定するキーです。省略可能です。 |
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')。 |
partition_strategy | 省略可能なパラメーターです。サポートされる値は WILDCARD または HIVE です。WILDCARD ではパス内に {_partition_id} が必要で、これはパーティションキーに置き換えられます。HIVE ではワイルドカードは使用できず、パスがテーブルのルートであると見なされ、ファイル名に Snowflake ID、拡張子にファイルフォーマットを使用した Hive 形式のパーティションディレクトリが生成されます。デフォルトは WILDCARD です。 |
partition_columns_in_data_file | 省略可能なパラメーターです。HIVE パーティション方式でのみ使用されます。パーティションカラムがデータファイルに書き込まれている想定かどうかを ClickHouse に指定します。デフォルトは false です。 |
extra_credentials | 省略可能なパラメーターです。ClickHouse Cloud のロールベースアクセスで role_arn を渡すために使用します。設定手順については Secure S3 を参照してください。 |
storage_class_name | 省略可能なパラメーターです。サポートされる値は STANDARD または INTELLIGENT_TIERING です。AWS S3 Intelligent Tiering を指定できます。デフォルトは STANDARD です。 |
GCSGoogle XML API の endpoint は JSON API とは異なるため、GCS の URL は次の形式になります。https://storage.cloud.google.com ではありません。
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 です。 |
戻り値
例
https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv からテーブルの先頭 5 行を選択する例:
ClickHouse は、ファイル名の拡張子からデータのフォーマットを判別します。たとえば、前のコマンドは ClickHouse はファイルの圧縮方式も判別できます。たとえば、ファイル名が
CSVWithNames を指定しなくても実行できました。.csv.gz で終わっていれば、ClickHouse が自動的に展開します。*.parquet.snappy や *.parquet.zstd のような名前の Parquet ファイルは、ClickHouse が誤って解釈し、TOO_LARGE_COMPRESSED_BLOCK や ZSTD_DECODER_FAILED エラーの原因になることがあります。
これは、Parquet では実際には行グループ単位およびカラム単位で圧縮が行われているにもかかわらず、ClickHouse がファイル全体を Snappy または ZSTD でエンコードされたデータとして読み込もうとするためです。Parquet のメタデータには、各カラムの圧縮方式がすでに記録されているため、ファイル拡張子は不要です。
このような場合は、compression_method = 'none' を指定してください。使用方法
- ‘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'
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 ファイルからデータを再帰的に取得します:
'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 パーティション方式の例
- キーにパーティション ID を使用すると、ファイルが個別に作成されます。
file_x.csv、file_y.csv、file_z.csv の3つのファイルに書き込まれます。
- バケット名にパーティション ID を含めると、別々のバケットにファイルが作成されます。
my_bucket_1/file.csv、my_bucket_10/file.csv、my_bucket_20/file.csv に書き込まれます。
公開バケットへのアクセス
403 エラーコードを返すことがあります。
この問題は、NOSIGN キーワードを使用してクライアントがすべての認証情報を無視し、リクエストに署名しないようにすることで回避できます。
S3認証情報の使用 (ClickHouse Cloud)
aws_access_key_id と aws_secret_access_key を関数に渡すことができます。例:
roleARN を extra_credentials パラメータ経由で s3 function に渡せます。例:
アーカイブの扱い
- ‘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'
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 設定
partition_strategy 引数を使用してください。
use_hive_partitioning を 1 に設定すると、ClickHouse はパス (/name=value/) 内の Hive スタイルのパーティション化を検出し、クエリ内でパーティションカラムを仮想カラムとして使用できるようになります。これらの仮想カラムには、パーティション化されたパス内と同じ名前が付きます。
例
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 スキーマ
record の leaf 数が tuple の要素数と一致しません…これは、ClickHouse がすべてのネストされたレコード構造に同一のスキーマを期待しているためです。 このような場合は、次のいずれかの方法で対応できます。
schema_inference_mode='union'を使用して、異なるネストされたレコードのスキーマをマージする、または- ネストされた構造を手動で揃えたうえで、
use_structure_from_insertion_table_in_table_functions=1を有効にする。
パフォーマンスに関する注意
schema_inference_mode='union' は、スキーマを推論するために各ファイルをスキャンする必要があるため、非常に大規模な S3 データセットでは時間がかかる場合があります。