はじめに
Snowflakeの一括ロード(バルクロードとも言う)に必要なステージについて調査した際のまとめです。
ステージを選ぶ際の検討材料に。
内部ステージ
内部ステージは、ユーザーステージ、テーブルステージ、名前付きステージの3種類。ローカルにあるファイルにも対応(putコマンドでファイルを置く)。
ユーザーステージ
・ユーザーにデフォルトで割り当てられるステージ(ユーザー1人に対して1つ)
・デフォルトのためDROPしたりCREATEできない
・ファイルが1人のユーザーのみによってアクセスされ、複数のテーブルにロードしたいとき
→ ユーザー1:テーブル多
・LIST @~
で参照する
・必要な権限:テーブルのINSERT権限
テーブルステージ
・テーブルにデフォルトで割り当てられるステージ(テーブル1つに対して1つ)
・デフォルトのためDROPしたりCREATEできない
・複数のユーザーがファイルにアクセスでき、一つのテーブルのみにロードしたいとき
→ ユーザー多:テーブル1
・LIST @%xxxxx
で参照する
・必要な権限:ステージのREAD権限とテーブルの所有権(OWNERSHIP権限)
名前付きステージ
・CREATE/DROP可能、最も柔軟
・適切な権限を持つユーザーは任意のテーブルにデータをロードする
→ ユーザー多:テーブル多
・LIST @xxxxx
で参照する
・必要な権限:ステージのREAD権限とテーブルのINSERT権限
外部ステージ
外部ステージの種類は1つ。クラウドストレージをステージとして利用する。外部ステージのデータはsnowflake上で保持しておらず、窓を通して見ているイメージ。
・クラウドストレージに対応(AWS, Azure, Google Cloud)
・適切な権限を持つユーザーは任意のテーブルにデータをロード可能
→ ユーザー多:テーブル多 (前述の名前付きステージが外部ストレージになったver.と個人的に思っている)
・LIST @xxxxx
で参照する
・必要な権限:ステージのUSAGE権限&テーブルのINSERT権限
・snowpipeによる自動取込が可能
→snowpipeについてはこちら
まとめ
・内部ステージは3種類、外部ステージは1種類
・ファイルの置き場所がクラウドストレージorローカルか、
ファイルを触るのは複数ユーザーor単一ユーザーか、
ロードするテーブルは1ファイルに対して複数テーブルor単一テーブルか、
で適切なステージが見えてくる
調べていて思ったのは、
テーブルステージにおいて、必要な権限に「テーブルの所有権」があるのは注意かなと感じました(私は見落としていました)。
他のステージはテーブルのINSERT権限でOKなのに対し、テーブルステージだけ所有権(あらゆる操作権限を包括してるので結構強め)が必要になるので、他の部分の設計にも影響がないか見直すことがおすすめです。
参考
内部ステージ
https://docs.snowflake.com/ja/user-guide/data-load-local-file-system-create-stage#user-stages
外部ステージ
https://docs.snowflake.com/ja/user-guide/data-load-s3-create-stage