■ はじめに
https://dk521123.hatenablog.com/entry/2021/11/15/221245
で、Snowflake の データロードについて扱ったが、 今回は、業務でデータアンロード について扱いそうなので 復習も兼ねて、まとめておく。
目次
【1】アンロード(Unload)とは? 【2】Snowflakeによるアンロード 1)ステージ(Stage) 【3】AWS S3 へのアンロード 1)必要な権限 2)S3バケットへの出力設定 3)使用上の注意 【4】主な出力フォーマット 【5】サンプル 1)AWS S3 へのアンロード (TSV)
【1】アンロード(Unload)とは?
(そもそも)アンロード(Unload)とは
https://docs.snowflake.com/ja/user-guide-data-unload.html
より抜粋 ~~~~~~~~~ Snowflakeテーブルからデータをアンロード(つまり、エクスポート) ~~~~~~~~~ => つまり、Snowflakeテーブルからデータをファイル出力すること
補足:Redshiftにおいて
* Snowflake 特有ではなく、Redshiftにも同じ機能があった
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_unloading_data.html
【2】Snowflakeによるアンロード
* COPY INTO <場所>で可能
https://docs.snowflake.com/ja/user-guide/data-unload-overview.html
https://docs.snowflake.com/ja/sql-reference/sql/copy-into-location.html
=> Redshift のように、アンロード専用なコマンド(UNLOAD)ではない
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_UNLOAD.html
1)ステージ(Stage)
https://dk521123.hatenablog.com/entry/2021/11/02/130111
より抜粋 ~~~~~ * ファイルからデータをロードする際に、そのファイルを置く場所 ~~~~~
【3】AWS S3 へのアンロード
* 以下の公式ドキュメントを参照しながら、やるとよさそう。
https://docs.snowflake.com/ja/user-guide/data-unload-s3.html
1)必要な権限
より抜粋 ~~~~~~~~~~~~~~~ Snowflakeには、フォルダー(およびすべてのサブフォルダー)に 新しいファイルを作成するため、S3バケットおよびフォルダーに対する 次の権限が必要です。 ~~~~~~ * s3:DeleteObject * s3:PutObject ~~~~~~ ベストプラクティスとして、Snowflakeは、外部クラウドストレージの認証責任を Snowflake IDおよびアクセス管理(IAM)エンティティに委任するように、 ストレージ統合オブジェクトを構成することをお勧めします。 ~~~~~~~~~~~~~~~ * 「ストレージ統合オブジェクト」については、以下の関連記事を参照のこと
Snowflake ~ ストレージ統合 ~
https://dk521123.hatenablog.com/entry/2022/06/29/221037
2)S3バケットへの出力設定
* COPY INTO コマンドでは、以下を選択する必要がある ~~~~~~ [1] S3バケットを参照する名前付き外部ステージオブジェクトを指定するか(推奨) [2] バケットの URI /ストレージ統合の いずれか を指定して、バケットに直接アンロード ~~~~~~ => 以下の公式ドキュメントの記述や構成図を読んでおくといいかも。
https://docs.snowflake.com/ja/user-guide/data-unload-s3.html
3)使用上の注意
* 以下の関連記事を参照のこと。
Snowflakeアンロード の 使用上の注意
https://dk521123.hatenablog.com/entry/2022/07/06/145724
【4】主な出力フォーマット
* フォーマットである程度、出力する形式はコントロールできるが 項目ごとの指定ではないので、なかなか難しい、、、
1)Type = CSV
https://docs.snowflake.com/ja/sql-reference/sql/create-file-format#type-csv
* FIELD_DELIMITER = 'character' | NONE => 区切り文字 * ESCAPE = 'character' | NONE => エスケープの際の文字指定 * ESCAPE_UNENCLOSED_FIELD = 'character' | NONE => 囲い文字なしの際のエスケープ * FIELD_OPTIONALLY_ENCLOSED_BY = 'character' | NONE => 囲み文字の指定
【5】サンプル
* 以下の「COPY INTO <場所>」のAPI仕様を見ながら作成するといいかも。
https://docs.snowflake.com/ja/sql-reference/sql/copy-into-location.html
1)AWS S3 へのアンロード (TSV)
-- 専用のDBを作成 CREATE DATABASE demo_bank; -- 使用するDB/Schemaを指定 USE DATABASE demo_bank; USE SCHEMA public; -- ストレージ統合を作成 -- 「TYPE = EXTERNAL_STAGE」で外部ステージオブジェクトを指定 CREATE STORAGE INTEGRATION storage_integration_for_unload TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = S3 ENABLED = TRUE STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::11111111:role/role-for-unload' STORAGE_ALLOWED_LOCATIONS = ('s3://your-s3-bucket-name/demo/') ; -- ステージ作成 CREATE STAGE IF NOT EXISTS demo_bank.public.demo_stage_for_unload URL='s3://your-s3-bucket-name/demo/for_unload/' STORAGE_INTEGRATION=storage_integration_for_unload ; -- アンロード前にデータ削除 -- (後述「補足1:REMOVEコマンド」参照) REMOVE @demo_bank.public.demo_stage_for_unload/insert=20220704/; -- アンロード (TSV) COPY INTO @demo_bank.public.demo_stage_for_unload/insert=20220704/demo_output.tsv FROM ( SELECT * FROM demo_bank.public.demo_trips ) FILE_FORMAT = ( TYPE=CSV FIELD_DELIMITER = '\t' DATE_FORMAT = 'YYYY/MM/DD' TIME_FORMAT = 'HH24:MI:SS.FF' TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF' FIELD_OPTIONALLY_ENCLOSED_BY = '"' NULL_IF = ( '' ) COMPRESSION = NONE ) SINGLE=TRUE HEADER = TRUE ;
補足1:REMOVEコマンド
* 以下の関連記事を参照のこと。
https://dk521123.hatenablog.com/entry/2022/09/26/150259
関連記事
Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world ~
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ 基本編 / データロード ~
https://dk521123.hatenablog.com/entry/2021/11/15/221245
Snowflake ~ ストレージ統合 ~
https://dk521123.hatenablog.com/entry/2022/06/29/221037
Snowflake ~ Removeコマンド ~
https://dk521123.hatenablog.com/entry/2022/09/26/150259
Snowflakeアンロード の 使用上の注意
https://dk521123.hatenablog.com/entry/2022/07/06/145724
指定した日付分アンロードするSQLを生成するPythonコード
https://dk521123.hatenablog.com/entry/2023/08/09/000000