Snowflake

Snowflake Directory Tablesでステージ内ファイルのメタデータを管理する方法

2026-03-26
更新: 2026-03-27
NicheeLab編集部

Directory Tables(ディレクトリテーブル)は、Snowflakeのステージ上にあるファイルの メタデータ(パス・サイズ・更新日時・チェックサムなど)をSQLで照会できる機能です。 データレイク上のファイル管理をSnowflakeのSQL操作に統合でき、 ファイル一覧の取得・差分検出・Streamによるファイル到着イベント駆動処理を実現します。

Directory Tablesの有効化

-- 既存ステージにDirectory Tablesを有効化
ALTER STAGE raw_data_stage SET DIRECTORY = (ENABLE = TRUE);

-- 新規ステージ作成時に有効化(External Stage / S3の例)
CREATE OR REPLACE STAGE landing_stage
  URL = 's3://my-bucket/landing/'
  STORAGE_INTEGRATION = s3_integration
  DIRECTORY = (ENABLE = TRUE);

-- 自動リフレッシュも同時に有効化
CREATE OR REPLACE STAGE landing_stage
  URL = 's3://my-bucket/landing/'
  STORAGE_INTEGRATION = s3_integration
  DIRECTORY = (
    ENABLE = TRUE
    AUTO_REFRESH = TRUE
  );

-- Internal Stageの場合
CREATE OR REPLACE STAGE internal_landing
  DIRECTORY = (ENABLE = TRUE);

Directory Tablesのメタデータ列

列名説明
RELATIVE_PATHVARCHARステージのルートからの相対ファイルパス
SIZENUMBERファイルサイズ(バイト)
LAST_MODIFIEDTIMESTAMP_LTZファイルの最終更新日時
MD5VARCHARファイルのMD5ハッシュ(External Stageのみ)
ETAGVARCHARクラウドストレージのETag
FILE_URLVARCHARSnowflake内部でファイルにアクセスするためのURL

Directory Tablesへのクエリ

-- ステージ内の全ファイル一覧を取得
SELECT * FROM DIRECTORY(@landing_stage);

-- 特定の拡張子でフィルタ
SELECT relative_path, size, last_modified
FROM DIRECTORY(@landing_stage)
WHERE relative_path LIKE '%.parquet';

-- 過去24時間以内に追加されたファイル
SELECT relative_path, size, last_modified
FROM DIRECTORY(@landing_stage)
WHERE last_modified >= DATEADD(HOUR, -24, CURRENT_TIMESTAMP());

-- ファイル数とサイズの集計
SELECT
  SPLIT_PART(relative_path, '.', -1) AS file_extension,
  COUNT(*) AS file_count,
  SUM(size) / (1024 * 1024) AS total_size_mb
FROM DIRECTORY(@landing_stage)
GROUP BY file_extension
ORDER BY total_size_mb DESC;

メタデータの手動リフレッシュ

-- ステージ全体のメタデータをリフレッシュ
ALTER STAGE landing_stage REFRESH;

-- 特定のサブパスのみリフレッシュ(大量ファイル時に効率的)
ALTER STAGE landing_stage REFRESH SUBPATH = '/2026/03/';

自動リフレッシュ(AUTO_REFRESH = TRUE)が有効な場合、 クラウドストレージ側のイベント通知をトリガーにメタデータが自動更新されます。 Internal Stageでは自動リフレッシュが利用できないため、手動リフレッシュが必須です。

自動リフレッシュのクラウド別設定

クラウドイベント通知設定手順
AWS S3SNSトピック + S3イベント通知SYSTEM$GET_AWS_SNS_IAM_POLICY()でポリシーを取得し、SNSに設定
Azure BlobEvent GridSYSTEM$GET_AZURE_SAS_TOKEN()でSASトークンを生成し、Event Gridを構成
GCSPub/Sub通知SYSTEM$GET_GCP_SERVICE_ACCOUNT()でサービスアカウントを取得し、Pub/Subに設定

Streamとの連携でファイル到着駆動処理

-- Directory TableにStreamを作成
CREATE OR REPLACE STREAM landing_file_stream
  ON STAGE landing_stage;

-- Streamから新着ファイルを検出
SELECT *
FROM landing_file_stream
WHERE METADATA$ACTION = 'INSERT';

-- Taskと連携して新着ファイルを自動処理
CREATE OR REPLACE TASK process_new_files
  WAREHOUSE = etl_wh
  SCHEDULE = '5 MINUTE'
  WHEN SYSTEM$STREAM_HAS_DATA('landing_file_stream')
AS
  COPY INTO raw_data
  FROM @landing_stage
  FILES = (
    SELECT RELATIVE_PATH
    FROM landing_file_stream
    WHERE METADATA$ACTION = 'INSERT'
  )
  FILE_FORMAT = (TYPE = 'PARQUET');

ファイルURL関数

-- スコープ付きURL(セッション内で有効な一時URL)
SELECT BUILD_SCOPED_FILE_URL(@landing_stage, relative_path)
FROM DIRECTORY(@landing_stage)
WHERE relative_path LIKE '%.pdf';

-- ステージURL(Snowflake内部参照用)
SELECT BUILD_STAGE_FILE_URL(@landing_stage, relative_path)
FROM DIRECTORY(@landing_stage);

-- 署名付きURL(外部共有用、有効期限付き)
SELECT GET_PRESIGNED_URL(@landing_stage, relative_path, 3600)
FROM DIRECTORY(@landing_stage)
WHERE relative_path = 'reports/2026-Q1.pdf';

コスト見積もり

-- 自動リフレッシュのコスト見積もり
SELECT SYSTEM$ESTIMATE_AUTOMATIC_REFRESH_COST('landing_stage');

ベストプラクティス

  • 自動リフレッシュはExternal Stageでのみ有効化:Internal Stageでは手動リフレッシュを定期Taskで実行するパターンが一般的
  • サブパス別リフレッシュで効率化:日付パーティション単位でREFRESH SUBPATHを指定し、不要なスキャンを回避する
  • Streamと組み合わせてCDCパターンを構築:Directory Table上のStreamでファイル到着を検知し、Taskで自動ロードを実行する
  • LIST @stageとの使い分け:LIST @stageはリアルタイムの一覧取得だがキャッシュされない。Directory Tablesはメタデータがキャッシュされ高速だが、リフレッシュまでのラグがある

問題で確認

Data Loading

問題 1

S3上のExternal StageでDirectory Tablesを有効化し、AUTO_REFRESH = TRUEを設定した。新しいファイルがS3にアップロードされたがDIRECTORY()関数の結果に反映されない。最も可能性の高い原因はどれか。

  1. Directory Tablesは Internal Stageでのみ利用可能であり、External Stageでは動作しない
  2. S3バケットからSnowflakeへのSNSイベント通知の設定が完了していない
  3. AUTO_REFRESH機能にはEnterprise Edition以上が必要である
  4. DIRECTORY()関数ではなくLIST @stageコマンドを使用する必要がある

正解: B

S3のDirectory Tablesの自動リフレッシュには、S3バケットのイベント通知→SNSトピック→Snowflakeという通知パイプラインの設定が必要です。この設定が不完全だとファイル追加イベントがSnowflakeに到達せず、メタデータが自動更新されません。Directory TablesはExternal/Internal両方のStageで利用可能で、Standard Editionでも使用できます。

よくある質問

Directory Tablesの自動リフレッシュではクレジットが発生しますか?

はい。自動リフレッシュはイベント通知(AWS SNS / Azure Event Grid / GCP Pub/Sub)を契機にメタデータを更新するサーバーレス処理であり、Serverless Creditとして課金されます。ファイルの追加・削除頻度が高いステージではコストが増加するため、SYSTEM$ESTIMATE_AUTOMATIC_REFRESH_COST()関数で事前にコストを見積もることが推奨されます。

Directory Tablesのメタデータにカスタム列を追加できますか?

Directory Tables自体にカスタム列を追加することはできません。固定のカラム(RELATIVE_PATH, SIZE, LAST_MODIFIED, MD5, ETAG, FILE_URL)のみが提供されます。カスタム属性が必要な場合は、Directory Tablesの結果と外部メタデータ管理テーブルをJOINするパターンが一般的です。

Internal StageとExternal StageのどちらでもDirectory Tablesは使えますか?

はい、どちらのステージタイプでもDirectory Tablesを有効化できます。ただし自動リフレッシュはExternal Stage(S3/GCS/Azure Blob)でのみサポートされます。Internal Stageの場合はALTER STAGE REFRESH を手動実行してメタデータを更新する必要があります。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.