BigQuery テーブルデータを Cloud Spanner にリバース ETL してみた。

BigQuery テーブルデータを Cloud Spanner にリバース ETL してみた。

Clock Icon2024.10.19

こんにちは、みかみです。

先日、人生で初めて野生のハブに遭遇しました。
10mくらい先の道の真ん中にいたのを見ただけですが、遠目からでも認識できるハブ柄だったので、怖いので引き返しました。

やりたいこと

  • BigQuery テーブルデータを直接 Cloud Spanner に取り込みたい

特に大規模なシステムにおいて、RDB に格納したトランザクションデータを DWH で集計して、その結果を RDB に戻して API などで参照するユースケースもあるのではないかと思います。
Google Cloud 環境であれば、Spanner データを参照する外部テーブルを作成しておけば、BigQuery から直接 Spanner データを参照できます。

また、SQL 1本で BigQuery データを直接 Spanner に連携できるようなので、試してみました。

前提

BigQuery や Spanner の API の有効化と操作に必要な権限は付与済みです。

また、文中、プロジェクトIDなど一部の文字は伏字に変更しています。

なお、本エントリで紹介している、EXPORT DATA クエリを使用した BigQuery から Spanner へのデータエクスポートは、2024/10 現在、まだプレビューの機能です。
ご利用の際にはご留意ください。

準備

BigQuery の以下のテーブルデータ50件を、Spanner に連携します。

bq_mart_test_schema

bq_mart_test_detail

bq_mart_test_preview

Spanner に test-mikami という名前のインスタンスを建てて、work データベースを作成しました。
work データベースで BigQuery の連携元テーブルと同等の以下の DDL を実行して、mart_test テーブルを作成しました。

CREATE TABLE mart_test (
  created_at TIMESTAMP,
  id INT64,
  first_name STRING(1024),
  last_name STRING(1024),
)
PRIMARY KEY(created_at);

spanner_schema_mart_test

BigQuery テーブルデータを Spanner にエクスポート

BigQuery で、以下の SQL を実行しました。

EXPORT DATA OPTIONS (
  uri="https://spanner.googleapis.com/projects/[PROJECT_ID]/instances/test-mikami/databases/work",
  format='CLOUD_SPANNER',
  spanner_options="""{ "table": "mart_test" }"""
)
AS SELECT * FROM work.mart_test;

bq_export2spanner

正常にエクスポートできたようなので、Spanner のテーブルデータを確認してみます。

spanner_select_mart_test

EXPORT DATA クエリ実行で、BigQuery テーブルデータが Spanner に連携できることが確認できました。

JSON 型データも連携できるか確認

ドキュメントによると、STRUCT などの一部のデータ型は Spanner に同等のデータ型がないためサポートされていないそうです。

では、JSON 型カラムのデータは EXPORT DATA で連携できるか確認してみます。

以下の DDL を実行して、Spanner に temp_json テーブルを作成しました。

CREATE TABLE temp_json (
  col_1 JSON,
  col_2 JSON,
  col_3 STRING(1024),
)
PRIMARY KEY(col_3);

spanner_schema_temp_json

連携元の BigQuery テーブルは以下です。

bq_temp_json_schema

bq_temp_json_detail

bq_temp_json_preview

BigQuery で以下の SQL を実行しました。

EXPORT DATA OPTIONS (
  uri="https://spanner.googleapis.com/projects/[PROJECT_ID]/instances/test-mikami/databases/work",
  format='CLOUD_SPANNER',
  spanner_options="""{ "table": "temp_json" }"""
)
AS SELECT * FROM dataset_1.temp_json;

spanner_select_temp_json

JSON 型は Spanner でもサポートされているので、CAST などのデータ変換する必要はなく、そのままエクスポートできました。

BigQuery から Bigtable へのリバース ETL

EXPORT DATA を使って、同様に Bigtable にも BigQuery テーブルデータをエクスポートできるようです。
Spanner へのデータエクスポートは 2024/10 現在まだプレビューですが、Bigtable へのエクスポートは GA になりました。

ですが、こちらは BigQuery Enterprise または Enterprise Plus エディションでのみサポートされているとのことです。

オンデマンドで実行したところ、やはり以下のエラーが発生しました。

error_bq_export2bigtable

同じく Enterprise または Enterprise Plus エディションでのみサポートされている、Continuous queries(継続的クエリ)と合わせての利用が想定されているのかと思いました。

まとめ(所感)

SQL を1本実行するだけで、あっけないほど簡単に BigQuery から Spanner にデータ連携できることが確認できました。

一部、データ型やカラムデータサイズど制限事項があるとはいえ、主に BigQuery と Spanner の仕様差異に起因するものであり、EXPORT DATA で指定する SELECT 文で変換すれば問題ないのではないかと思います。

BigQuery からデータをファイル出力してバッチ処理で Spanner に取り込んで...のような作り込みが必要なくなるのはとてもありがたいと思いました!

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.