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

  • Amazon S3互換ストレージ

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

外部ステージ内部ステージSnowflake Gitリポジトリクローン

構文

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

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 句に対して指定された出力ステージからのオプションの相対パスです。

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

名前付き内部ステージ

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

スキーマ内のオブジェクトに対して操作を実行するには、親データベースとスキーマに対する USAGE 権限が必要です。スキーマに対する 任意の権限を付与されたロールは、そのロールがスキーマを解決できることに注意してください。たとえば、スキーマに対するCREATE権限を付与されたロールは、そのスキーマにオブジェクトを作成できますが、そのスキーマに対する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 オプション(クエリからコピーする場合)を使用します。

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

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