BigQueryでリージョンだけ異なるテーブルを生成する方法

この記事は、 PLEX Advent Calendar 2024の15日目の記事です。

はじめに

こんにちは。コーポレートチームの石川です。

今回は BigQuery(以下、BQ)で異なるプロジェクトのデータセットを利用したい場合や、同一プロジェクト内で異なるリージョンにデータセットを作成したい場合の対応方法を記載します。

背景

社内プロジェクトの一部で、Heroku 上で Rails を動かしつつ、BQ のテーブルを利用し、EXTERNAL_QUERY で Cloud SQL を参照しているシステムがありました。

その際、Heroku・BQ・Cloud SQL のリージョンが異なり、本来2~3秒で終わるデータ取得処理が約16秒ほどかかる事象が発生しました。

そのため、リージョンを統一することで速度改善が見込めるかを検証する必要があり、今回の内容に至りました。

結論

BigQuery Data Transfer Service で解決!

機能に制限はあるものの、異なるプロジェクト間でデータセットを同期したり、同一プロジェクト内で異なるリージョンのデータセット同期することが可能です。さすが Google

BigQuery Data Transfer Service とは  |  Google Cloud

設定方法

1. データセットを生成したい BQ(転送先)にアクセスする

初めての場合、データ転送ページから「作成」を押すと BigQuery Data Transfer API を有効にするか確認されるため、有効にします。

2. 転送設定を行う

転送元・転送先の情報は以下の通りです。

プロジェクト情報

## 転送元
プロジェクト名: source-project-444601
リージョン: asia-northeast1
データセット: source
テーブル: user,order

## 転送先
プロジェクト名: destination-project-444601
リージョン: us-east4
データセット: destination
テーブル:  user,orderテーブルが同期される

3. データ転送ができたか確認

データ転送設定後、「今すぐ転送を実行」を選択します。何もしない場合は、cron 設定が実行されるまで転送されないので注意してください。

手動で実行後、指定した source データセットのテーブルが、異なるリージョンの状態で同期されれば成功です!

4. 同一プロジェクトでリージョンを変更する

次に、同一プロジェクト内でリージョンを変更するケースを説明します。この場合、転送元と転送先のデータセット名が異なる必要があるので注意してください。

プロジェクト情報

## 転送元(先ほどの転送元)
プロジェクト名: destination-project-444601
リージョン: us-east4
データセット: destination
テーブル:  user,orderテーブル

## 転送先
プロジェクト名: destination-project-444601
リージョン: asia-northeast1
データセット: destination_asia
テーブル: user,orderテーブルが同期される

5. データ転送ができたか確認

転送が正しく行われたかを確認します。

まとめ

以上、BQ のデータ転送に関する対応方法を紹介しました。

他にも様々な方法があるかもしれませんが、既存のデータセットを汚さず、GUI 上で操作できるこの方法が一番手軽ではないかと感じました!

さいごに

現在プレックスではソフトウェアエンジニア、フロントエンドエンジニア、UIデザイナーを募集しています。

とても働きやすい環境なので、一緒に働いてみたいと思った方がいましたら、是非ご連絡をお待ちしています!

dev.plex.co.jp