COPY FILES

ソースステージから出力ステージにファイルをコピーします。コピーするファイルリストは、クエリまたは既存ステージのリストを使用して提供できます。

ファイルをコピーする場合は、ステージをソースとして使用します。

  • ステージ間で名前変更なし。

  • ステージ間の単一のパターンに基づくファイルセットから、名前変更なし。

  • ハードコードされたファイル名のセットから。

ファイルをコピーする場合は、クエリをソースとして使用します。

このコマンドは、次のテーブルが示すように、既存の 名前付きステージ から、またはそのステージへのファイルコピー操作をサポートします。

ソースロケーション

ターゲットロケーション

名前付き内部ステージ

名前付き内部ステージ

外部ステージ

名前付き内部ステージ

名前付き内部ステージ

外部ステージ

外部ステージ

外部ステージ

ターゲットまたはソースの外部ステージは、以下のクラウドストレージサービスまたはオンプレミスのいずれかの場所にあるファイルを参照できます。

  • Amazon S3

  • Google Cloud Storage

  • Microsoft Azure Blobストレージ

  • Microsoft Data Lake Storage Gen2

  • MicrosoftAzure汎用v2

  • Amazon S3互換ストレージ

こちらもご参照ください。

外部ステージ内部ステージ

構文

ステージからのコピーする

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

クエリからのコピーする

COPY FILES INTO @[<namespace>.]<stage_name>[/<path>/]
  FROM ( SELECT <existing_url> [ , <new_filename> ] FROM ... )
  [ DETAILED_OUTPUT = { TRUE | FALSE } ]
Copy

必須パラメーター

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 に提供される出力ステージからの相対パスです。その結果、ファイルは次の場所にコピーされます。

@[<名前空間>.]<ステージ名>[/<パス>]<新しいファイル名>

new_filename 列が提供されない場合は、 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

名前付き内部ステージ

ターゲットの内部ステージで必要。

スキーマ内のオブジェクトに対して操作を実行するには、親データベースとスキーマに対する USAGE 権限が必要です。

指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。

セキュリティ保護可能なオブジェクト に対して 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 オプション(クエリからコピーする場合)を使用します。

      例については、 パターンの一致を使用してファイルをコピーする をご参照ください。

  • 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;
Copy

注釈

保護されたストレージの場所を持つ外部ステージから、またはその外部ステージにファイルをコピーするには、ステージ定義にクラウドのストレージの場所にアクセスするための認証情報が含まれていることを確認します。

既存のソースステージ(src_stage)から既存のターゲットステージ(trg_stage)にコピーするファイル名を指定します。

COPY FILES
  INTO @trg_stage
  FROM @src_stage
  FILES = ('file1.csv', 'file2.csv');
Copy

既存のステージ(src_stage/src_path/)の特定パスから、既存のターゲットステージ(trg_stage/trg_path/)の特定パスにファイルをコピーします。

COPY FILES
  INTO @trg_stage/trg_path/
  FROM @src_stage/src_path/;
Copy

パターンの一致を使用してファイルをコピーする

既存のソースステージ(src_stage)上の任意パスにある圧縮 CSV ファイルのみを、既存のターゲットステージ(trg_stage)にロードするには、パターンマッチを使用します。

COPY FILES
  INTO @trg_stage
  FROM @src_stage
  PATTERN='.*/.*/.*[.]csv[.]gz';
Copy

.* コンポーネントは、任意の文字が0回以上出現することを表します。角括弧は、ファイル拡張子の前のピリオド文字(.)をエスケープします。

文字列 sales を名前に含む非圧縮 CSV ファイルのみをコピーします。

COPY FILES
  INTO @trg_stage
  FROM @src_stage
  PATTERN='.*sales.*[.]csv';
Copy

クエリで定義されたファイルをコピーする

単一ファイルをコピーする

ファイル名はソースステージと同じままです。

COPY FILES
  INTO @trg_stage
  FROM (SELECT '@src_stage/file.txt');
Copy

単一ファイルを任意のファイルにコピーする

COPY FILES
  INTO @trg_stage
  FROM (SELECT '@src_stage/file.txt', 'new_filename.txt');
Copy

テーブルからファイルをコピーする

一般的な処理を可能にする汎用クエリがサポートされています。

-- 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

一部のファイルのみをコピーする

COPY FILES
  INTO @trg_stage
  FROM (SELECT src_file, trg_file FROM urls WHERE src_file LIKE '%file%');
Copy

ディレクトリからファイルをコピーする

COPY FILES
  INTO @trg_stage
  FROM (SELECT relative_path FROM directory(@src_stage) WHERE relative_path LIKE '%.txt');
Copy