この記事は何?
BigQuery Advent Calendar 2021 の5日目の記事です。
普段使ってるBigQueryとSnowflakeでデータを移動させる方法のうち、Snowflake => BigQuery の回です。
全体の流れ
全体の流れはシンプルです。
- バケット準備:GCPでGCSにバケットとデータを置くパスを切っておきます
- ストレージ統合作成:Snowflakeでストレージ統合を作ります
- IAMロール作成:GCP上でIAMロールを作ってパーミッションを与えます
- IAMロール割当:Snowflakeのストレージ統合で作られたサービスアカウントにIAMロールを割り当てます
- Snowflakeからアンドロード:Snowflakeから
COPY INTO <場所>
を使って、GCSにデータをアンロードします - BigQueryで読み込み:BigQueryでGCSの該当パスを外部テーブルに指定して、SELECTします
- 完了
どうでしょうかんたんでしょ?
しかも一度ストレージ統合を作ってしまえば、配下のパスに好きにデータをアンロードできるので、BigQueryでも読ませ放題ですね。
バケット準備
特に言うことはありませんが、バケットとパスを作りましょう。
このあたりを読んで好きな方法で作成しましょう。
ストレージ統合作成
Snowflakeへログインして、ストレージ統合を作りましょう。
ドキュメントはこちらです
使うSQLはこんな感じです。
CREATE STORAGE INTEGRATION gcs_int
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = GCS
ENABLED = TRUE
STORAGE_ALLOWED_LOCATIONS = ('gcs://hogehogehoge/from-snowflake/')
;
ストレージ統合ができたら、 DESC STORAGE INTEGRATION
で割り当てられた、サービスアカウントを確認しておきましょう。
STORAGE_GCP_SERVICE_ACCOUNT
のところに書かれています。
IAMロール作成:
次にGCSにアクセスできるようにIAMロールを作成します。
必要な権限は下記になります。
- storage.buckets.get
- storage.objects.create
- storage.objects.delete
- storage.objects.get
- storage.objects.list
GCPのIAMの管理画面からポチポチ作成しましょう。
詳細はこのあたりの手順を参考にしてください。
IAMロール割当
次はストレージ統合で割り当てられたサービスアカウントに、今作ったIAMロールを割り当てます。
作業は引き続きGCPのIAMの管理画面からポチポチで行えるはずです。
詳細はこのあたりの手順を参考にしてください。
Snowflakeからアンドロード
次はついにSnowflakeからデータをアンロードします。
データのアンロードには COPY INTO <場所>
を使います。
このとき <場所>
には gcs://バケット名/パス名/
を指定します。
オプションを含めて指定すると下記のようなSQLになります。
copy into 'gcs://mybucket/unload/'
from <テーブル名やSELECT文>
storage_integration = <ストレージ統合名>;
メチャクチャ簡単ですね。
BigQueryで読み込み
最後はBigQueryで外部テーブルとして読み込んだら完了です。
このあたりの手順を参考に作ってみましょう。
最後に
だいたい慣れてくると10分くらいで作業できるようになります。
これでお客様に**「SnowflakeのこのデータをBigQueryに読み込ませてほしいんですが、どれくらいかかりますか?」を「10分!!!」と答えられる**ようになりますね!
ちなみに、GCSにデータを置きっぱなしにすれば、Snowflakeからも外部テーブルとしてクエリできるようになっていますので、捗るかもしれません。
また、アンロードする時にHive形式のパーティションに則ったパスでアンロードすれば、BigQuery側もパーティションとして読み取れるので効率が良さそうです。
ちなみにGCSはアップロードが無料だったと思うので、費用的にはアンロードにかかったSnowflakeのウェアハウス消費クレジットと、AWSからGCSへのアウトバウンドの通信費だけです。
お安そうですね。