🔖

Snowflakeのファイルフォーマット

2022/10/21に公開

ファイルフォーマットオブジェクトを作成することで事前にフォーマットを定義できます。
早速作ってみましょう!

ファイルフォーマットの作成

作業用スキーマの作成

これは別に作成しなくてもOK。ただ整理しやすいので作成しているだけです。

CREATE OR REPLACE SCHEMA MANAGE_DB.file_formats;

ファイルフォーマットオブジェクトの作成

CREATE OR REPLACE file format MANAGE_DB.file_formats.my_file_format;

作成時にオプションを指定していないので下記のとおりデフォルトの値としてオブジェクトが作成されました。
ポイントとして

  • ファイルタイプがCSV
  • フィールド区切り文字がカンマ
  • スキップヘッダーが0
  • 文字コードがUTF-8
property property_type property_value property_default
TYPE String CSV"" CSV""
RECORD_DELIMITER String \n"" \n""
FIELD_DELIMITER String , ,
FILE_EXTENSION String
SKIP_HEADER Integer 0 0
DATE_FORMAT String AUTO"" AUTO""
TIME_FORMAT String AUTO"" AUTO""
TIMESTAMP_FORMAT String AUTO"" AUTO""
BINARY_FORMAT String HEX"" HEX""
ESCAPE String NONE"" NONE""
ESCAPE_UNENCLOSED_FIELD String \"" \""
TRIM_SPACE Boolean FALSE FALSE
FIELD_OPTIONALLY_ENCLOSED_BY String NONE"" NONE""
NULL_IF List [""\N""] [""\N""]
COMPRESSION String AUTO"" AUTO""
ERROR_ON_COLUMN_COUNT_MISMATCH Boolean TRUE TRUE
VALIDATE_UTF8 Boolean TRUE TRUE
SKIP_BLANK_LINES Boolean FALSE FALSE
REPLACE_INVALID_CHARACTERS Boolean FALSE FALSE
EMPTY_FIELD_AS_NULL Boolean TRUE TRUE
SKIP_BYTE_ORDER_MARK Boolean TRUE TRUE
ENCODING String UTF8"" UTF8""

COPYコマンドでの使い方

作成したファイルフォーマットオブジェクトの使い方はとても簡単です。
オプションのfile_format = (FORMAT_NAME={作成したフォーマット名})で指定するだけです。

COPY INTO OUR_FIRST_DB.PUBLIC.ORDERS_EX
    FROM @MANAGE_DB.external_stages.aws_stage_errorex
    file_format= (FORMAT_NAME=MANAGE_DB.file_formats.my_file_format)
    files = ('OrderDetails_error.csv');

SKIP_HEADERの設定を変更してみる

設定変更はALTERコマンドで行えます。

ALTER file format MANAGE_DB.file_formats.my_file_format
    SET SKIP_HEADER = 1;

設定を確認してみると・・・property_valueの値が0→1に変わっています。

property property_type property_value property_default
SKIP_HEADER Integer 1 0

ファイルタイプをJSONに変更してみる

ALTER file format MANAGE_DB.file_formats.my_file_format
    SET TYPE=JSON;

しかしエラーとなりました。

SQL compilation error: File format type cannot be changed.

つまり一度作成したファイルタイプは変更ができません。
なので再作成するしか方法がないかもしれません。
再作成するとJSON形式で作成できました。

CREATE OR REPLACE file format MANAGE_DB.file_formats.my_file_format
    TYPE=JSON
property property_type property_value property_default
TYPE String JSON"" CSV""

Discussion