snowflake-tips-content-type

Amazon Web Services

【Snowflake Tips】Content-Typeには気をつけよう、という話

こんにちは、小郷です。
皆様は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 のような “普段は意識しないメタ情報” が挙動に影響するケースは、原因特定に時間がかかりがちです。
本記事が、同じような状況で頭を悩ませる方の助けとなり、調査に費やす時間をほんの少しでも短縮できていれば幸いです。

データ連携を自動化!Fivetranの概要・料金とスプレッドシートからBigQueryへ接続する方法前のページ

協力と裏切りの理論次のページ囚人のジレンマ

ピックアップ記事

  1. 最速で理解したい人のためのIT用語集

関連記事

  1. Snowflake

    Snowflake無料トライアルの始め方

    こんにちは、中村です。意外にも弊社ブログで記事がなかったので、今回は…

  2. Snowflake

    Snowflakeとは?Data Cloud World Tour から見る2023年の現在地

    こんにちは、エクスチュアの喜田です。2023年の初めからSnowfl…

  3. Amazon Web Services

    Amazon Redshift ビルド168まとめ

    この記事はAmazon Redshiftのアップデート情報からどのよう…

  4. Generative AI

    Snowflake の Copilot が優秀すぎる件について

    こんにちは、喜田です。いままでSnowflakeのライトユー…

  5. Snowflake

    第14回関西DB勉強会-Snowflake Summit参加報告-

    2024年6月22日、恒例の関西DB勉強会(第14回)に参加させてい…

カテゴリ
最近の記事
  1. モック作成が面倒で “楽” した話
  2. Fivetranからdbtプロジェクトを実行する
  3. Account Engagementで送るメールをマルチエー…
  4. 協力と裏切りの理論
  5. 【Snowflake Tips】Content-Typeには…
  1. Snowflake

    [Snowflake Summit 2025] Snowflake Postgr…
  2. コンバージョンファネル

    【Tips】ファネル機能について
  3. Tableau

    Tableauの便利な機能
  4. IT用語集

    DaaS / HaaS / IaaS / PaaS / SaaSって何?
  5. Adobe Analytics

    ページの深さとは-Adobe Analyticsの指標説明
PAGE TOP