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. dbt Projecs on Snowflake

    dbt Projects on Snowflakeで作成したプロジェクトのdocsを見る方法

    こんにちは、中村です。Snowflakeで作成したdbtのプ…

  2. Amazon Web Services

    Direct Connect vs Site to Site VPN

    AWS Direct Connect と Site to Site V…

  3. Data Clean Room

    PostgreSQLによるデータクリーンルームの可能性について

    こんにちは、喜田です。本投稿は PostgreSQL Adv…

  4. Snowflake

    【dbts25】Snowflake×PostgreSQLのニュースを読む!登壇資料

    こんにちは、喜田です。2025年7月11日 インサイトテクノ…

  5. RevOps

    Snowflakeや最新データ基盤が広義のマーケティングにもたらす価値 in 2024

    こんにちは、喜田です。この投稿はSnowflake Adve…

  6. Python

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

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

カテゴリ
最近の記事
  1. 【Snowflake Tips】Content-Typeには…
  2. データ連携を自動化!Fivetranの概要・料金とスプレッド…
  3. Adobe WebSDK クロスドメイン計測【第2部】FPI…
  4. Adobe WebSDK クロスドメイン計測【第1部】ECI…
  5. Adobe Target Recommendations:g…
  1. Data Clean Room

    SnowflakeのData Clean Roomを基礎から一番詳しく解説(3回…
  2. Adobe Analytics

    BigQuery: Adobe Datafeed: event_listカラムの…
  3. Python

    わかりやすいPyTorch入門④(CNN:畳み込みニューラルネットワーク)
  4. ブログ

    ダッシュボードに使うべき10のグラフ①
  5. Adobe Analytics

    Adobe Analytics: BigQuery+Lookerでアトリビューシ…
PAGE TOP