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

    Amazon Redshift ビルド168まとめ

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

  2. Data Clean Room

    Snowflake の新しいData Clean Roomの見どころを解説

    こんにちは、喜田です。私は昨年Snowflakeのデータクリーンルー…

  3. Cortex

    Snowflake Summit 2025 参加レポート【Day2】

    こんにちは、エクスチュアの黒岩です。昨日投稿したSnowfl…

  4. Amazon Web Services

    セキュリティグループ vs ネットワークACL

    セキュリティグループ と ネットワークACL の違いセキュリティグ…

  5. Snowflake

    ThoughtSpotとSnowflakeを使ってセルフBIの世界を体験してみた

    こんにちは、エクスチュアの大崎と申します。BIツール使ってま…

  6. Cortex

    コンポーザブルCDPにおけるSnowflakeのマルチモーダルLLMの期待

    こんにちは、喜田です。本記事ではコンポーザブルCDPとは何か…

カテゴリ
最近の記事
  1. AtScale Developer Editionでセマンテ…
  2. 真打ち登場LOD ~TableauのEXCLUDE関数を知ろ…
  3. DataformでactAs権限に適合する設定をする
  4. 真打ち登場LOD ~TableauのINCLUDE関数を知ろ…
  5. 真打ち登場LOD ~TableauのFIXED関数を知ろう~…
  1. Tableau

    真打ち登場LOD ~TableauのINCLUDE関数を知ろう~
  2. Snowflake

    ThoughtSpotとSnowflakeを使ってセルフBIの世界を体験してみた…
  3. Tableau

    【TC19ブログ】エクスチュアの海外カンファレンス参加支援制度
  4. IT用語集

    インジェクション攻撃(Injection Attack)って何?
  5. Snowflake

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