こんにちは、小郷です。
皆様はContent-Typeを気にされたことはありますでしょうか。
Content-Typeとは、HTTP通信において、サーバーがクライアントに返すデータの種類を示すメタ情報です。HTTPレスポンスヘッダーのフィールドに含まれ、ブラウザやミドルウェア等が「このデータをどう扱うべきか」を判断するための重要な指標となります。
そして実はこの 「データをどう扱うべきか」 というメタ情報は、
Webブラウザだけでなく ストレージサービスやDWHのロード処理にも影響を与えます。
事象
さて先日、次のような現象に遭遇しました。
Snowflakeにおいて以下のようにステージおよびファイルフォーマットを定義していました。
# フォーマット定義
CREATE OR REPLACE FILE FORMAT my_csv_format
TYPE = 'CSV'
FIELD_DELIMITER = ','
FIELD_OPTIONALLY_ENCLOSED_BY = '"'
SKIP_HEADER = 1
NULL_IF = ('NULL')
ENCODING = 'utf-8';
# ステージ定義
CREATE OR REPLACE STAGE my_stage
STORAGE_INTEGRATION = my_integration
URL = 's3://my-bucket/'
FILE_FORMAT = my_csv_format;
この定義をもとに、S3 に置いた CSV ファイルを、COPY 句で読み込もうとします。
COPY INTO my_table (${カラム定義・省略}) FROM
@my_stage
PATTERN='hoge/hoge\.csv'
FILE_FORMAT= (
FORMAT_NAME='my_csv_format'
)
ON_ERROR='ABORT_STATEMENT'
PURGE=FALSE
TRUNCATECOLUMNS=FALSE
FORCE=TRUE
ところが——ファイルは認識されているのに、取り込み行数が 0 件。
「存在は見えるのに中身を読んでいない」という珍妙な状態になりました。
その原因が Content-Type だった
ファイルの中身が何かおかしいのか?と、s3からhoge/hoge.csvファイルをダウンロードして確認してみると、
hoge.txt
なんということでしょう。拡張子がtxtになっています。
こちらの不可解な挙動の原因はすぐに判明しました。
当該オブジェクトの Content-Type が
text/plain
になっていたというわけです。
S3に拡張子csvのファイルを手動アップロードした場合には問題なくtext/csvになってくれるのですが、サービスによってはtext/plainで送ってくるケースがあるようです。
対処方法としては、以下の選択肢があります。
1. ヘッダ情報で正しいContent-Typeを返すよう修正する
2. 取り込み側の定義を修正する
内製のアプリケーションであれば1の方法が選択できるケースもありますが、実務では2の方法しか取れない場合が往々にしてあると思います。今回も2のケースでした。
フォーマット定義を以下に変更すると、期待通りの行数を取り込んでくれました。
CREATE OR REPLACE FILE FORMAT my_csv_format
TYPE = 'CSV'
FIELD_DELIMITER = ','
FIELD_OPTIONALLY_ENCLOSED_BY = '"'
SKIP_HEADER = 1
RECORD_DELIMITER = '\n' # ここ重要
NULL_IF = ('NULL')
ENCODING = 'utf-8';
補足
これは Snowflake に限った話ではありません。
各種ドライバやミドルウェアの中には、受け付ける Content-Type が限定されているものも存在します。
想定と異なる Content-Type が渡されると、自動判別に失敗したり、処理そのものをスキップしてしまうケースもあります。
そのため、データ連携の場面では「拡張子が正しい=正しく解釈される」「サービス側でよしなにやってくれる」と思い込まず、
アップロード時の Content-Type が適切かどうかを確認することが、実はとても重要です。
終わりに
Snowflake を業務で利用するケースは近年ますます増えており、S3 との連携も日常的な作業になってきました。
その一方で、今回のように 「ファイルはあるのに中身が読めない」 といった、一見すると原因が分かりにくい事象に遭遇することも多いと思います。
とりわけ、Content-Type のような “普段は意識しないメタ情報” が挙動に影響するケースは、原因特定に時間がかかりがちです。
本記事が、同じような状況で頭を悩ませる方の助けとなり、調査に費やす時間をほんの少しでも短縮できていれば幸いです。












