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. Amazon Web Services

    Databricks Community Editionを使ってApache Sparkを無料で学ぶ…

    こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。…

  2. Snowflake

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

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

  3. Python

    Streamlit in Snowflakeによるダッシュボード作成

    こんにちは、エクスチュアの石原です。前回に引き続き、Stre…

  4. Snowflake

    [Snowflake Summit 2025] Snowflake × Crunchy Dataの発…

    こんにちは、喜田です。エクスチュアでSr. Data Evangel…

  5. Amazon Web Services

    Direct Connect vs Site to Site VPN

    AWS Direct Connect と Site to Site V…

  6. Cortex

    Cortex Analystを使ってみた

    こんにちは、中村です。皆さんはCortex Analystを使ってい…

カテゴリ
最近の記事
  1. 真打ち登場LOD ~TableauのEXCLUDE関数を知ろ…
  2. DataformでactAs権限に適合する設定をする
  3. 真打ち登場LOD ~TableauのINCLUDE関数を知ろ…
  4. 真打ち登場LOD ~TableauのFIXED関数を知ろう~…
  5. 真打ち登場LOD ~Tableauで苦戦するアイツを知ろう~…
  1. dbt Projecs on Snowflake

    dbt Projects on Snowflakeで作成したプロジェクトのdoc…
  2. dbt Projecs on Snowflake

    dbt Projects on SnowflakeをTASKを実行してみた
  3. マーケティング

    ジャーニーマップをデジタルマーケティングの視点で
  4. Mouseflow

    Mouseflowのフィルター機能が変わりました!
  5. Snowflake

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