はじめに:ファイルフォーマットって何のためにあるの?
Snowflakeにデータを取り込むとき、CSV・JSON・Parquetなどさまざまなファイルが登場します。でも「区切り文字はカンマ?タブ?」「ヘッダー行はスキップする?」「文字コードは?」と、ファイルごとに細かいルールがバラバラだと、毎回COPY INTOコマンドにオプションを書き連ねるのは大変ですよね。
そんなときに活躍するのが
ファイルフォーマット (FILE FORMAT) オブジェクト です。これは「このファイルはこういうルールで読んでね」という設定を、データベースの中に名前付きで保存しておける便利なオブジェクトです。一度作っておけば、何度でも使い回せます!
基本概念:ファイルフォーマットは「読み方の説明書」
ファイルフォーマットオブジェクトは、ステージにあるファイルをロード/アンロードするときの
パース(解釈)ルールをまとめた設定ファイルのようなものです。テーブルやスキーマと同じように、データベース・スキーマの配下に作成されます。
関係する登場人物を整理しておきましょう。詳しい全体像は
Snowflakeデータロードの全体像|バルク・ストリーミング・サードパーティをやさしく解説もあわせてご覧ください。
- ステージ:ファイルの置き場所(内部・外部ステージ)
- ファイルフォーマット:ファイルの読み方ルール ← 今回の主役
- COPY INTO:ステージのファイルをテーブルへ流し込む命令
対応している主なTYPEは
CSV,
JSON,
AVRO,
ORC,
PARQUET,
XML です。各形式の違いは
Snowflake対応ファイル形式まとめで解説しています。
作り方:CREATE FILE FORMATの基本
もっともシンプルなCSV用のファイルフォーマットを作ってみましょう。
CREATE OR REPLACE FILE FORMAT my_csv_format
TYPE = CSV
FIELD_DELIMITER = ','
SKIP_HEADER = 1
FIELD_OPTIONALLY_ENCLOSED_BY = '"'
NULL_IF = ('NULL', '\\N', '')
EMPTY_FIELD_AS_NULL = TRUE;
ポイントを見ていきましょう。
- TYPE:必須。ファイル形式を指定
- FIELD_DELIMITER:区切り文字(タブなら
'\t')
- SKIP_HEADER:先頭の何行を読み飛ばすか
- FIELD_OPTIONALLY_ENCLOSED_BY:値を囲む引用符
- NULL_IF:この値を見つけたらNULLとして扱う
JSONなら次のようにシンプルです。
CREATE OR REPLACE FILE FORMAT my_json_format
TYPE = JSON
STRIP_OUTER_ARRAY = TRUE;
STRIP_OUTER_ARRAY は、ファイル全体が
[ {...}, {...} ] のような配列になっている場合に、外側の角括弧を外して1件ずつのレコードとして読み込んでくれる便利オプションです。
使い方:COPY INTOから参照する
作ったファイルフォーマットは、
COPY INTOコマンドで
FILE_FORMAT オプションに名前を渡すだけで使えます。
COPY INTO sales_table
FROM @my_stage/sales/
FILE_FORMAT = (FORMAT_NAME = 'my_csv_format');
毎回オプションを書く必要がなく、設定の使い回しが効くのが嬉しいポイント。仮に区切り文字をセミコロンに変えたくなったら、ファイルフォーマット側を直すだけで全COPY INTOに反映されます。
Snowsightからの作成
Snowsightでも作成可能です。左メニューの
Data → Databases から対象スキーマを開き、「Create → File Format」を選ぶとフォームが表示され、TYPEやオプションをGUIで指定できます。
確認・変更・削除コマンド
-- 一覧を見る
SHOW FILE FORMATS;
-- 詳細を確認
DESC FILE FORMAT my_csv_format;
-- オプションを変更
ALTER FILE FORMAT my_csv_format SET SKIP_HEADER = 2;
-- 削除
DROP FILE FORMAT my_csv_format;
注意点とユースケース
- スキーマ単位で管理される:他スキーマから使うときは
db.schema.format_name のように完全修飾名で指定
- ステージに紐付けることもできる:
CREATE STAGE ... FILE_FORMAT = (FORMAT_NAME = 'my_csv_format') のように、ステージのデフォルト形式として登録すればCOPY INTOでの指定を省略可能
- 文字コードに注意:日本語CSVをロードする場合は
ENCODING = 'UTF8'(あるいは 'SHIFTJIS')を明示
まとめ
ファイルフォーマットオブジェクトは、Snowflakeのデータロードを
シンプル・再利用可能・保守しやすくしてくれる縁の下の力持ちです。最初は
my_csv_format や
my_json_format のように形式ごとに1つずつ用意しておけば、日々の取り込み作業がぐっと楽になりますよ。
参考リンク
関連記事