はじめに
SnowflakeにはStage(ステージ) と呼ばれるデータ格納用の機能があります。
- クラウドストレージ上のデータ
- ローカル環境にあるCSVファイル
- JSON/Parquet/XMLなどの半構造化データ
これらをStage経由でSnowflakeに取り込むことができます。
内部ステージなどは扱いやすい機能なので、ぜひ活用してみてください。
アジェンダ
- 外部ステージと内部ステージの違い
- データロードでサポートされているデータ型
- ステージの基本操作
- 内部ステージの実用例
- その他
1. 外部ステージと内部ステージの違い
Snowflakeのステージには次の2種類があります。
- 外部ステージ
- 内部ステージ
◆ 外部ステージ
Snowflake外部のクラウドストレージをステージとして利用する方式
対応しているクラウドストレージ
- Amazon S3
- Google Cloud Storage
- Microsoft Azure Blob Storage
特徴
- 大量データをクラウド側に保存したままSnowflakeへロードできる
- Snowpipeを利用すると自動ロードが可能
- Snowflake側のストレージコストを削減できる
- イベント通知により、新規ファイル追加 → 即ロードが可能
snowpipeを利用した自動ロードの流れ
- クラウドストレージにファイルがアップロードされる
- ストレージのイベントがSnowpipeに通知
- Snowpipeがファイルを検知
- Snowflakeのテーブルに自動でロード
◆ 内部ステージ
Snowflake内部ストレージを利用する方式
種類
| 種類 | 指定方法 | 説明 |
|---|---|---|
| ユーザーステージ | @~ | ユーザー専用 |
| テーブルステージ | @%テーブル名 | テーブルに紐づく |
| 名前付きステージ | @スキーマ名 | スキーマ内で共有して利用できる |
特徴
- Snowflake内にファイルをアップロードして管理できる
- ローカルのCSVを簡単にアップロード可能
- PUT/GETコマンドの操作がしやすい
2. データロードでサポートされているデータ型
| 種類 | 形式 | 説明 |
|---|---|---|
| 構造化 | 区切り(csv,tsv) | 有効なシングルバイト区切り文字サポート |
| 半構造化 | JSON | - |
| Avro | 圧縮されたAvroファイルの自動検出・処理含む | |
| ORC | 圧縮された ORC ファイルの自動検出・処理含む | |
| Parquet | 圧縮されたParquetファイルの自動検出・処理含む | |
| XML | - |
インフォメーション
上記のうち、アンロードに対応しているのはCSV、JSON、Parquetのみになります。
3. ステージの基本操作
| コマンド名 | 説明 | 備考 |
|---|---|---|
| PUT | ローカルPC → ステージへアップロード | 内部ステージのみ |
| COPY FILES | ステージ間でファイルコピー | - |
| GET | ステージ → ローカルへダウンロード | 内部ステージのみ |
| LIST | ステージ内部のファイル一覧を表示 | - |
| REMOVE | ステージ内のファイルを削除 | - |
4. 内部ステージの実用例
◆ 手動で内部ステージを利用する方法 ※テストデータを利用しております。
▶ ① CSVファイルを準備
アップロードできないケースがあるため、
ファイルの保護(読み取り専用など) は解除しておく必要があります。
▶ ② ステージを作成
ステージ作成時にファイルフォーマットを同時に指定することも可能です。
ステージ作成 SQL
CREATE OR REPLACE STAGE データベース名.スキーマ名.ステージ名
FILE_FORMAT = (TYPE = 'CSV');
▶ ③ Web UI からステージを確認
- カタログを開く
- データベースエクスプローラーでステージ名を検索
▶ ④ CSVのアップロード
- 右上の「+ファイル」ボタンをクリック
- アップロード画面にCSVをドラッグ&ドロップして取り込み
▶ ⑤ COPY INTOを使用してテーブルにロード
COPY INTO 例
COPY INTO データベース名.スキーマ名.テーブル名
FROM @データベース名.スキーマ名.ステージ名
FILE_FORMAT = @データベース名.スキーマ名.フォーマット名;
FILE FORMAT定義例
CREATE OR REPLACE FILE FORMAT データベース名.スキーマ名.フォーマット名
TYPE = CSV
SKIP_HEADER = 1
DATE_FORMAT = 'YYYY/MM/DD'
FIELD_OPTIONALLY_ENCLOSED_BY = '"';
その他
-
SnowSQLやバッチ処理で自動化可能
定期的なロードはタスクやSnowSQLと組み合わせても運用できます
-
COPY INTOは「新規ファイルのみ」ロード
Snowflakeはロード済みファイルを記録し、同じファイル名はスキップします
- Snowpipeの推奨ファイルサイズ
- 100~250MBの圧縮ファイルが最も効率的
- 大きく外れるとコスト効率が下がる場合がある
詳細はSnowflake公式ブログ参照:
https://www.snowflake.com/ja/blog/best-practices-for-data-ingestion/

