Snowflakeファイルフォーマットの作り方と使い方をやさしく解説

Snowflakeファイルフォーマットの作り方と使い方をやさしく解説 Snowflake

はじめに:ファイルフォーマットって何のためにあるの?

Snowflakeにデータを取り込むとき、CSV・JSON・Parquetなどさまざまなファイルが登場します。でも「区切り文字はカンマ?タブ?」「ヘッダー行はスキップする?」「文字コードは?」と、ファイルごとに細かいルールがバラバラだと、毎回COPY INTOコマンドにオプションを書き連ねるのは大変ですよね。 そんなときに活躍するのが ファイルフォーマット (FILE FORMAT) オブジェクト です。これは「このファイルはこういうルールで読んでね」という設定を、データベースの中に名前付きで保存しておける便利なオブジェクトです。一度作っておけば、何度でも使い回せます!

基本概念:ファイルフォーマットは「読み方の説明書」

ファイルフォーマットオブジェクトは、ステージにあるファイルをロード/アンロードするときのパース(解釈)ルールをまとめた設定ファイルのようなものです。テーブルやスキーマと同じように、データベース・スキーマの配下に作成されます。 関係する登場人物を整理しておきましょう。詳しい全体像はSnowflakeデータロードの全体像|バルク・ストリーミング・サードパーティをやさしく解説もあわせてご覧ください。
  • ステージ:ファイルの置き場所(内部・外部ステージ)
  • ファイルフォーマット:ファイルの読み方ルール ← 今回の主役
  • COPY INTO:ステージのファイルをテーブルへ流し込む命令
対応している主なTYPEは CSV, JSON, AVRO, ORC, PARQUET, XML です。各形式の違いはSnowflake対応ファイル形式まとめで解説しています。
Snowflakeファイルフォーマットとステージ・COPY INTOの関係を整理したデータロードの構成図

作り方: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で指定できます。
SnowsightのDataメニューからCreate File Formatでファイルフォーマットを新規作成する画面

確認・変更・削除コマンド

-- 一覧を見る
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_formatmy_json_format のように形式ごとに1つずつ用意しておけば、日々の取り込み作業がぐっと楽になりますよ。

参考リンク

関連記事