Snowflake外部テーブル入門|S3のファイルを直接クエリする方法

Snowflake外部テーブル入門|S3のファイルを直接クエリする方法 Snowflake

はじめに:データを「ロードせずに」クエリしたい!

こんにちは!Snowflakeでデータ分析をしていると、「クラウドストレージ(S3やAzure Blobなど)に置いてあるファイルを、わざわざテーブルにロードしないでそのまま参照したい」と思ったことはありませんか?

そんなときに大活躍するのが 外部テーブル(External Table) です。外部テーブルを使うと、Amazon S3・Google Cloud Storage・Azure Blobなどに置いた CSV / JSON / Parquet ファイルを、まるでSnowflake内部のテーブルかのようにSQLでクエリできちゃいます。

この記事では、外部テーブルの仕組みと作り方、注意点までを初心者向けにやさしく解説します!

Snowflake外部テーブルがS3やGCS上のCSV/JSON/Parquetファイルをロードせず仮想テーブルとして参照する仕組みを示すアーキテクチャ図

外部テーブルとは?

外部テーブルは、クラウドストレージにあるファイルをデータソースとする「読み取り専用の仮想テーブル」です。普通のテーブルと違って、Snowflakeの内部ストレージにはデータを保存しません。

イメージとしては「ファイルへのショートカットにスキーマ(列定義)を貼り付けたもの」と考えると分かりやすいです。クエリのたびに、Snowflakeが裏でファイルを読み取って結果を返してくれます。

普通のテーブルとの違い

  • データの所有場所:外部テーブルはクラウドストレージ側、通常テーブルはSnowflake内部
  • ロード作業:外部テーブルは COPY INTO 不要、ファイルを置くだけでOK
  • 書き込み:外部テーブルは読み取り専用(INSERT/UPDATEできない)
  • パフォーマンス:通常テーブルの方が速い(マイクロパーティション最適化が効くため)

外部テーブルの作り方

外部テーブルを作るには、まず 外部ステージファイルフォーマット を準備します。

1. ステージとファイルフォーマットを準備

-- 外部ステージ(S3)を作成
CREATE OR REPLACE STAGE my_ext_stage
  URL = 's3://my-bucket/sales/'
  STORAGE_INTEGRATION = my_s3_int;

-- Parquet用ファイルフォーマット
CREATE OR REPLACE FILE FORMAT my_parquet_fmt
  TYPE = PARQUET;

2. 外部テーブルを作成

CREATE OR REPLACE EXTERNAL TABLE sales_ext (
  order_id   NUMBER AS (VALUE:order_id::NUMBER),
  amount     NUMBER AS (VALUE:amount::NUMBER),
  order_date DATE   AS (VALUE:order_date::DATE)
)
LOCATION = @my_ext_stage
FILE_FORMAT = my_parquet_fmt
AUTO_REFRESH = TRUE;

外部テーブルは自動的に VALUE というメタデータ列を持ちます。VALUEにはファイル内の各レコード(1行)がVARIANT型として格納され、VALUE:カラム名::型のようにドット記法でフィールドにアクセスできます。ファイル全体ではなく、行単位での取り出しになる点に注意してください。 

3. 普通にSELECTするだけ!

SELECT order_date, SUM(amount)
FROM sales_ext
WHERE order_date >= '2026-01-01'
GROUP BY order_date;

もうこれで、S3上のParquetファイルが普通のテーブルのようにクエリできます。

Snowflake外部テーブルでS3のParquetファイルに対しSELECT文を実行しorder_dateごとに集計するSQLクエリ例

ユースケースと注意点

こんなときに便利!

  • データレイク連携:S3に蓄積されたログを、ロードなしで分析したい
  • お試し分析:本格的にロードする前に、ファイルの中身をSQLで確認したい
  • 巨大ファイル:全部ロードするとストレージ料金がかさむデータの一部だけ参照したい

注意点

  • クエリのたびにファイルを読むので、通常テーブルよりは遅い
  • パーティション列(例:日付ごとのフォルダ分割)を定義すると、不要なファイルをスキップでき高速化できる
  • ファイルが追加・更新されたことを検知するには AUTO_REFRESH = TRUE を設定(裏でイベント通知が必要)
  • 頻繁に集計するデータは、最終的に通常テーブルへ Snowpipe でロードした方が速い場合も多い

まとめ

外部テーブルは「ロードせずにクラウドストレージのファイルを直接クエリする」という、データレイク時代にぴったりの便利機能です。COPY INTOによるバルクロードと使い分けることで、コストとパフォーマンスのバランスを取った設計ができますよ。

まずはS3に置いたCSVやParquetを外部テーブルにして、SELECTしてみてください!

参考リンク

関連記事