■本記事の目的
Snowflakeのデータロードを理解する。
ユーザー管理のAmazonS3からSnowflakeにデータロードを行います。
S3バケットとフォルダおよび取込用のテストデータ(CSV形式)は、事前に作成済みとします。
■前回の記事
■概要
ファイル形式を作成していきます。
外部ステージを作成・利用するためには、パラメータオプションによりスキップしてもよいのですが、
実際の運用を想定し、定義しておくことをお勧めします。
■前提として
ファイル形式利用による外部ステージ作成ですが、前提として以下を行っておく必要があります。
・外部ステージで参照するS3の特定フォルダ内は、すべて同一のファイル形式で統一されていること
・異なるファイル形式の場合、フォルダごとの区画整理が最適化されていること。
上記、2点を行っておかないと、ロード時にエラーが起こり、またフォルダ内部のファイルをロードする際の設計や仕様としても非効率になります。
■ファイルを参照する。
作成前に、ロードするファイルの内容を整理しましょう。
以下が代表的な考慮点にはなります。
・拡張子:csv、jsonなど
・エンコード:utf-8、shift-jisなど
・列区切り:カンマ、タブ、パイプなど
・囲い文字:"(ダブルクォーテーション)など
・圧縮方式:圧縮なし、gzipなど
・ヘッダーの有無
・日付・タイムスタンプ
他にある場合は公式リファレンスを参照ください。
※特に考慮しなくていい場合は、デフォルトオプションで良いです。
今回の記事では以下のテストデータ(CSV形式)をロードします。
↓↓↓↓
ファイルについて整理したところ以下のようになりました。
・拡張子:csv
・エンコード:utf-8
・列区切り:カンマ
・囲い文字:なし
・圧縮方式:圧縮なし
・ヘッダーの有無:あり
・タイムスタンプ:Snowflakeのデフォルト形式である。
■ファイル形式を作成する。
スキーマオブジェクトのため、作成権を持っているロールで作成します。
前段で整理したファイル内容と公式リファレンスからの設定値を、
作成文のオプションに反映します。
use role <ロール>;
use database <データベース>;
use schema <スキーマ>;
create file format <ファイル形式>
type = CSV
compression = AUTO
field_delimiter =','
skip_header = 1
field_optionally_enclosed_by = NONE
encoding = 'UTF8'
;
/*※オプションは例です。適宜追加・変更してください。*/
■ファイル形式の命名について
ファイル形式の名称ですが、筆者は各オプションを英数3文字以内で
"_"区切りで命名していることが多いです。※[N]は、NO,NONEを表す
例)CSV_HE_CM_NFO_U8
ファイル形式の種類が多い場合は、外部ステージから接頭辞付きの類似の名前で定義するのも良いと考えます。運用で利用するファイル形式の共通利用が最適であるかなどは、別途ご検討ください。
■注意点
ファイル形式ですが、ロード/アンロードは、オプションが異なるため、分けてファイル形式を定義することをお勧めします。※外部ステージも同様に分けて定義する。
■あとがき
他案件で、ファイル形式を作成しないパターン(外部ステージに直接ファイル形式オプションを入力する)を拝見したことがありますが、コードの冗長化を防ぐためにも定義はしておいた方が良いと思われます。また、定義書作成時も参照整理がしやすくなるメリットがあるので是非活用しましょう。