7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BigQueryAdvent Calendar 2021

Day 5

SnowflakeからBigQueryにデータを移動する

Posted at

この記事は何?

BigQuery Advent Calendar 2021 の5日目の記事です。
普段使ってるBigQueryとSnowflakeでデータを移動させる方法のうち、Snowflake => BigQuery の回です。

全体の流れ

全体の流れはシンプルです。

  1. バケット準備:GCPでGCSにバケットとデータを置くパスを切っておきます
  2. ストレージ統合作成:Snowflakeでストレージ統合を作ります
  3. IAMロール作成:GCP上でIAMロールを作ってパーミッションを与えます
  4. IAMロール割当:Snowflakeのストレージ統合で作られたサービスアカウントにIAMロールを割り当てます
  5. Snowflakeからアンドロード:Snowflakeから COPY INTO <場所> を使って、GCSにデータをアンロードします
  6. BigQueryで読み込み:BigQueryでGCSの該当パスを外部テーブルに指定して、SELECTします
  7. 完了

どうでしょうかんたんでしょ?
しかも一度ストレージ統合を作ってしまえば、配下のパスに好きにデータをアンロードできるので、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へのアウトバウンドの通信費だけです。
お安そうですね。

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?