COPY FILES¶
ソースの場所から出力ステージにファイルをコピーします。コピーするファイルのソースとして、ステージまたはクエリを使用することができます。
ソースとしてステージを使用し、名前を変更せずにファイルをあるステージから別のステージにコピーします。
次のタスクのソースとしてクエリを使用します。
クエリ(SELECT ステートメント)で定義されたファイルセットから、またはファイルセットへのコピー。
UDF(例: Snowpark Python UDFs からのファイル書き込みと UDTFs)によって記述されたファイルからのコピー。
スコープ付きまたはステージ URLs からのコピー。
次のテーブルが示すように、既存の 名前付きステージ から、またはそのステージへコピーできます。
ソースロケーション |
ターゲットロケーション |
|---|---|
名前付き内部ステージ |
名前付き内部ステージ |
外部ステージ |
名前付き内部ステージ |
名前付き内部ステージ |
外部ステージ |
外部ステージ |
外部ステージ |
Snowflake Gitリポジトリクローン |
名前付き内部ステージ |
Snowflake Gitリポジトリクローン |
外部ステージ |
ターゲットまたはソースの外部ステージは、以下のクラウドストレージサービスまたはオンプレミスのいずれかの場所にあるファイルを参照できます。
Amazon S3
Google Cloud Storage
Microsoft Azure Blobストレージ
Microsoft Data Lake Storage Gen2
MicrosoftAzure汎用v2
- こちらもご参照ください。
構文¶
ステージからのコピーする¶
COPY FILES INTO @[<namespace>.]<stage_name>[/<path>/]
FROM @[<namespace>.]<stage_name>[/<path>/]
[ FILES = ( '<file_name>' [ , '<file_name>' ] [ , ... ] ) ]
[ PATTERN = '<regex_pattern>' ]
[ DETAILED_OUTPUT = { TRUE | FALSE } ]
クエリからのコピーする¶
COPY FILES INTO @[<namespace>.]<stage_name>[/<path>/]
FROM ( SELECT <existing_url> [ , <new_filename> ] FROM ... )
[ DETAILED_OUTPUT = { TRUE | FALSE } ]
必須パラメーター¶
INTO @[namespace.]stage_name[/path/]コピーされたファイルのターゲットロケーションを指定します。
namespaceは、内部ステージまたは外部ステージが存在するデータベースまたはスキーマで、database_name.schema_nameまたはschema_nameの形式です。データベースとスキーマがユーザーセッション内で現在使用されている場合、名前空間は オプション です。それ以外の場合は必須です。pathは、ソースステージまたはターゲットステージの特定の場所からコピーするファイルのセットを指定するクラウドのストレージの場所にある、大文字と小文字を区別するオプションのパスです。クラウドストレージサービスによっては、パスを プレフィックス または フォルダー と呼ぶ場合があります。
注釈
ターゲットパス名またはソースパス名に特殊文字やスペースが含まれている場合は、
INTO ...値を一重引用符で囲む必要があります。INTO ...の値はリテラル定数にする必要があります。値を SQL 変数 にすることはできません。
ソースとしてのステージの使用¶
FROM @[namespace.]stage_name[/path/]コピーするファイルがステージされているソースロケーションを指定します。
FROM ...に提供される値は、INTO...値と同じ指定と制約に従います。
ソースとしてのクエリの使用¶
FROM (SELECT existing_url [ , new_filename ] FROM ... )コピーされたファイルのソースの場所と、オプションで相対出力の場所を指定します。SELECT クエリが返す各行は、コピーするファイルを表しています。
existing_urlはスコープ付き URL、ステージ名、またはステージ URL です。new_filenameは、INTO句に対して指定された出力ステージからのオプションの相対パスです。
Snowflakeはファイルを次の場所にコピーします。
@[<名前空間>.]<ステージ名>[/<パス>]<新しいファイル名>new_filenameの値を指定しない場合、Snowflakeはexisting_urlの相対パスを使用します。
オプションのパラメーター¶
FILES = ( 'file_name' [ , 'file_name' ... ] )コピーするファイル名をコンマ区切りで1つ以上指定します。ファイルは、コマンドで指定したソースロケーションにあらかじめステージされている必要があります。Snowflakeは、見つからない指定されたファイルをスキップします。
最大1000個のファイル名を指定できます。
クエリからのファイルのコピーは、このオプションをサポートしていません。代わりに、クエリを使用してファイル名リストを提供します。
注釈
外部ステージのファイルパスを設定するために、Snowflakeはステージ定義にある URL をリスト内の各ファイル名の前に付加します。
しかし、Snowflakeは、パスとファイル名の間に区切り文字を挿入しません。ステージ定義の URL 末尾、または
FILESリストにある各ファイル名の先頭のいずれかに区切り文字(/)を明示的に含める必要があります。PATTERN = 'regex_pattern'コピーするファイルのリストをフィルターするための正規表現パターンを指定します。このコマンドは、
FROM句のストレージの場所全体に正規表現を適用します。クエリからのファイルのコピーは、このオプションをサポートしていません。代わりに、パターンに一致するようにクエリを使用します。
Tip
最高のパフォーマンスを得るために、多数のファイルをフィルターするパターンは避けてください。
DETAILED_OUTPUT = { TRUE | FALSE }コマンド出力が、コピー操作の結果を要約するか、コピーされた各ファイルをリストするかを指定します。
- 値:
TRUEの場合、出力にはターゲットロケーションにコピーされた各ファイルの行が含まれます。fileという名前の単一列には、コピーされた各ファイルのターゲットパス(該当する場合)とファイル名が含まれます。FALSEの場合、出力はコピーされたファイルの数を含む単一行になります。
- デフォルト:
TRUE
アクセス制御の要件¶
この SQL コマンドの実行に使用される ロール には、少なくとも次の 権限 が必要です(ソースおよびターゲットロケーションによる)。
権限 |
オブジェクト |
注意 |
|---|---|---|
USAGE |
外部ステージ |
ソースまたはターゲットの外部ステージで必要。 |
READ |
名前付き内部ステージ |
ソースの内部ステージで必要。 |
WRITE |
名前付き内部ステージ |
ターゲットの内部ステージで必要。 |
Operating on an object in a schema requires at least one privilege on the parent database and at least one privilege on the parent schema.
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
使用上の注意¶
このコマンドは、次のアクションをサポートしていません。
テーブル ステージへの、またはそのテーブルからのファイルのコピー。
ステージをソースとして使用する場合は、 ユーザー ステージへ、またはそのステージからファイルをコピーします。
取得する前に復元が必要な、アーカイブクラウドストレージクラスにあるデータのコピー。これらのアーカイブストレージクラスには、Amazon S3 Glacier Flexible Retrieval、Glacier Deep Archive、またはMicrosoft Azure Archive Storageが含まれます。
5GB より大きいファイルのコピー。
このコマンドを実行する際の注意事項:
COPY FILES ステートメントは、ターゲットロケーションにある、名前が一致する既存のファイルをすべて上書きします。このコマンドは、 コピーされたファイル名と一致しない既存のファイルを削除 しません。
ファイルコピー操作が失敗した場合、Snowflakeは自動クリーンアップを実行しません。
Google Cloud Storageからのファイルのコピー: 外部ステージのオブジェクトリストに1つ以上のディレクトリblobが含まれていると、 COPY FILES ステートメントが失敗する可能性があります。 ディレクトリblob は、スラッシュ文字(
/)で終わるパスです。以下のLIST @<stage>の出力例では、my_gcs_stage/load/はディレクトリblobです。+---------------------------------------+------+----------------------------------+-------------------------------+ | name | size | md5 | last_modified | |---------------------------------------+------+----------------------------------+-------------------------------| | my_gcs_stage/load/ | 12 | 12348f18bcb35e7b6b628ca12345678c | Mon, 11 Aug 2022 16:57:43 GMT | | my_gcs_stage/load/data_0_0_0.csv.gz | 147 | 9765daba007a643bdff4eae10d43218y | Mon, 11 Aug 2022 18:13:07 GMT | +---------------------------------------+------+----------------------------------+-------------------------------+
Google Cloudコンソールを使用してディレクトリを作成すると、Googleはディレクトリblobを作成します。
この問題を回避し、コピーするファイルを指定するには、
PATTERNオプション(ステージからコピーする場合)またはFROMオプション(クエリからコピーする場合)を使用します。例については、 パターンの一致を使用してファイルをコピーする をご参照ください。
Snowflakeは、Amazon S3およびGoogle Cloud Storageへのアップロード時にマルチパートアップロードを使用します。不完全なアップロードが蓄積されないようにするには、ライフサイクルルールを設定することを推奨します。手順については、Amazon S3 または Google Cloud Storage ドキュメントをご参照ください。
COPY FILES コマンドには、データ転送とコンピューティングコストがかかります。
データ転送: クラウドプロバイダーは、各自のネットワークから転送されたデータ分に課金する場合があります。これらの費用を回収するため、Snowflakeは、Snowflakeの内部ステージから、異なる リージョン または異なるクラウドプロバイダーの外部ステージにファイルをコピーする際に、バイトごとの手数料を請求します。Snowflakeでは、データのイングレス(外部ステージから内部ステージにファイルをコピーする場合など)には課金されません。
データ転送請求の詳細については、 データ転送のコストについて をご参照ください。
コンピューティング: COPY FILES は サーバーレス 機能で、仮想ウェアハウスを必要としません。Snowflakeの請求書の COPY FILES コマンドの項目には、クラウドサービスの料金は含まれません。
コンピューティングリソースの請求の詳細については、 コンピューティングコストについて をご参照ください。
注釈
Native Appsやワークシートなど、一部のSnowflake機能では COPY FILES の料金が発生します。その結果、 COPY FILES コマンドを実行していなくても、 COPY FILES の料金が表示される場合があります。これらの料金の詳細については、 Snowflakeサポート にお問い合わせください。
Snowflakeは、このコマンドのファイルコピー履歴を維持しません。
例¶
ファイルをコピーする¶
既存のソースステージ(src_stage)から既存のターゲットステージ(trg_stage)にすべてのファイルをコピーします。
COPY FILES
INTO @trg_stage
FROM @src_stage;
注釈
保護されたストレージの場所を持つ外部ステージから、またはその外部ステージにファイルをコピーするには、ステージ定義にクラウドのストレージの場所にアクセスするための認証情報が含まれていることを確認します。
既存のソースステージ(src_stage)から既存のターゲットステージ(trg_stage)にコピーするファイル名を指定します。
COPY FILES
INTO @trg_stage
FROM @src_stage
FILES = ('file1.csv', 'file2.csv');
既存のステージ(src_stage/src_path/)の特定パスから、既存のターゲットステージ(trg_stage/trg_path/)の特定パスにファイルをコピーします。
COPY FILES
INTO @trg_stage/trg_path/
FROM @src_stage/src_path/;
パターンの一致を使用してファイルをコピーする¶
既存のソースステージ(src_stage)上の任意パスにある圧縮 CSV ファイルのみを、既存のターゲットステージ(trg_stage)にロードするには、パターンマッチを使用します。
COPY FILES
INTO @trg_stage
FROM @src_stage
PATTERN='.*/.*/.*[.]csv[.]gz';
.* コンポーネントは、任意の文字が0回以上出現することを表します。角括弧は、ファイル拡張子の前のピリオド文字(.)をエスケープします。
文字列 sales を名前に含む非圧縮 CSV ファイルのみをコピーします。
COPY FILES
INTO @trg_stage
FROM @src_stage
PATTERN='.*sales.*[.]csv';
クエリを使用してファイルをコピーする¶
単一ファイルをコピーする¶
ファイル名はソースステージと同じままです。
COPY FILES
INTO @trg_stage
FROM (SELECT '@src_stage/file.txt');
単一ファイルをコピーして名前を変更する¶
COPY FILES
INTO @trg_stage
FROM (SELECT '@src_stage/file.txt', 'new_filename.txt');
テーブルからすべてのファイルをコピーする¶
クエリを使用して複数のファイルをコピーするには、汎用クエリを使用できます。
-- Create a table with URLs
CREATE TABLE urls(src_file STRING, trg_file STRING);
INSERT INTO urls VALUES ('@src_stage/file.txt', 'new_filename.txt');
-- Insert additional URLs here
COPY FILES
INTO @trg_stage
FROM (SELECT src_file, trg_file FROM urls);
一部のファイルのみをコピーする¶
この例では、フィルターを使用してパターンに一致するファイルをコピーします。
COPY FILES
INTO @trg_stage
FROM (SELECT src_file, trg_file FROM urls WHERE src_file LIKE '%file%');
ディレクトリテーブルからファイルをコピーする¶
COPY FILES
INTO @trg_stage
FROM (SELECT relative_path FROM directory(@src_stage) WHERE relative_path LIKE '%.txt');