BQ を使用した Snowflake から Spanner へのリバース ETL

1. Google Cloud Storage と BigQuery を使用して Snowflake から Spanner へのリバース ETL パイプラインを構築する

はじめに

この Codelab では、Snowflake から Spanner へのリバース ETL パイプラインを構築します。従来、ETL(抽出、変換、読み込み)パイプラインは、分析のためにオペレーショナル データベースから Snowflake などのデータ ウェアハウスにデータを移動します。リバース ETL パイプラインは、その逆の処理を行います。キュレートされ処理されたデータをデータ ウェアハウスから運用システムに移動し、アプリケーションの強化、ユーザー向け機能の提供、リアルタイムの意思決定に使用できるようにします。

目標は、集計されたデータセットを Snowflake Iceberg テーブルから、高可用性アプリケーションに最適なグローバルに分散されたリレーショナル データベースである Spanner に移動することです。

これを実現するために、Google Cloud Storage(GCS)と BigQuery が中間ステップとして使用されます。このアーキテクチャのデータフローと、その理由の内訳は次のとおりです。

  1. Iceberg 形式の Snowflake から Google Cloud Storage(GCS):
  • まず、オープンで明確に定義された形式で Snowflake からデータを取得します。テーブルは Apache Iceberg 形式でエクスポートされます。このプロセスでは、基盤となるデータが Parquet ファイルのセットとして書き込まれ、テーブルのメタデータ(スキーマ、パーティション、ファイルの場所)が JSON ファイルと Avro ファイルとして書き込まれます。この完全なテーブル構造を GCS にステージングすると、データがポータブルになり、Iceberg 形式を理解する任意のシステムからアクセスできるようになります。
  1. GCS の Iceberg テーブルを BigQuery BigLake 外部テーブルに変換する:
  • GCS から Spanner にデータを直接読み込むのではなく、BigQuery を強力な仲介役として使用します。GCS の Iceberg メタデータ ファイルを直接指す BigLake 外部テーブルを BigQuery に作成します。このアプローチにはいくつかのメリットがあります。
  • データの重複なし: BigQuery は、メタデータからテーブル構造を読み取り、Parquet データファイルをインジェストせずにその場でクエリします。これにより、時間とストレージ費用を大幅に節約できます。
  • 連携クエリ: GCS データに対して、ネイティブの BigQuery テーブルであるかのように複雑な SQL クエリを実行できます。
  1. BigQuery から Spanner:
  • 最後のステップは、BigQuery から Spanner にデータを移動することです。これは、BigQuery の強力な機能である EXPORT DATA クエリ(「リバース ETL」ステップ)を使用して実現します。
  • 運用の準備: Spanner はトランザクション ワークロード向けに設計されており、アプリケーションに強整合性と高可用性を提供します。データを Spanner に移動することで、低レイテンシのポイント ルックアップを必要とするユーザー向けアプリケーション、API、その他のオペレーショナル システムからアクセスできるようになります。
  • スケーラビリティ: このパターンでは、BigQuery の分析能力を活用して大規模なデータセットを処理し、Spanner のグローバルにスケーラブルなインフラストラクチャを通じて結果を効率的に提供できます。

サービスと用語

  • Snowflake - データ ウェアハウス サービスを提供するクラウド データ プラットフォーム。
  • Spanner - フルマネージドのグローバル分散型リレーショナル データベース。
  • Google Cloud Storage - Google Cloud の BLOB ストレージ サービス。
  • BigQuery - 分析用のフルマネージドのサーバーレス データ ウェアハウス。
  • Iceberg - Apache によって定義されたオープン テーブル形式。一般的なオープンソースのデータファイル形式の抽象化を提供します。
  • Parquet - Apache によるオープンソースのカラム型バイナリ データファイル形式。

学習内容

  • Snowflake にデータを読み込む方法
  • GCS バケットの作成方法
  • Snowflake テーブルを Iceberg 形式で GCS にエクスポートする方法
  • Spanner インスタンスを設定する方法
  • BigQuery の BigLake 外部テーブルを Spanner に読み込む方法

2. 設定、要件、制限事項

前提条件

  • Snowflake アカウント
  • BigQuery から Spanner にエクスポートするには、BigQuery の Enterprise ティア以上の予約がある Google Cloud アカウントが必要です。
  • ウェブブラウザを介した Google Cloud コンソールへのアクセス
  • Google Cloud CLI コマンドを実行するターミナル
  • Google Cloud 組織で iam.allowedPolicyMemberDomains ポリシーが有効になっている場合、管理者は外部ドメインのサービス アカウントを許可する例外を付与する必要がある場合があります。該当する場合は、後のステップで説明します。

制限事項

このパイプラインで発生する可能性のある特定の制限事項とデータ型の非互換性を認識しておくことが重要です。

Snowflake から Iceberg への移行

Snowflake と Iceberg では列のデータ型が異なります。これらの間の変換については、Snowflake のドキュメントをご覧ください。

Iceberg から BigQuery

BigQuery を使用して Iceberg テーブルにクエリを実行する場合、いくつかの制限事項があります。完全なリストについては、BigQuery のドキュメントをご覧ください。BIGNUMERICINTERVALJSONRANGEGEOGRAPHY などの型は現在サポートされていません。

BigQuery to Spanner

BigQuery から Spanner への EXPORT DATA コマンドは、すべての BigQuery データ型をサポートしていません。次のタイプのテーブルをエクスポートすると、エラーが発生します。

  • STRUCT
  • GEOGRAPHY
  • DATETIME
  • RANGE
  • TIME

また、BigQuery プロジェクトで GoogleSQL 言語が使用されている場合、次の数値型も Spanner へのエクスポートでサポートされません。

  • BIGNUMERIC

制限事項の完全な最新リストについては、公式ドキュメントの Spanner へのエクスポートの制限事項をご覧ください。

Snowflake

この Codelab では、既存の Snowflake アカウントを使用するか、無料トライアル アカウントを設定できます。

Google Cloud Platform IAM 権限

この Codelab のすべての手順を実行するには、Google アカウントに次の権限が必要です。

サービス アカウント

iam.serviceAccountKeys.create

サービス アカウントの作成を許可します。

Spanner

spanner.instances.create

新しい Spanner インスタンスの作成を許可します。

spanner.databases.create

DDL ステートメントを実行して作成できるようにします

spanner.databases.updateDdl

DDL ステートメントを実行してデータベースにテーブルを作成できます。

Google Cloud Storage

storage.buckets.create

エクスポートされた Parquet ファイルを保存する新しい GCS バケットを作成できます。

storage.objects.create

エクスポートされた Parquet ファイルを GCS バケットに書き込むことを許可します。

storage.objects.get

BigQuery が GCS バケットから Parquet ファイルを読み取れるようにします。

storage.objects.list

BigQuery が GCS バケット内の Parquet ファイルを一覧表示できるようにします。

Dataflow

Dataflow.workitems.lease

Dataflow からの作業項目の取得を許可します。

Dataflow.workitems.sendMessage

Dataflow ワーカーが Dataflow サービスにメッセージを送信できるようにします。

Logging.logEntries.create

Dataflow ワーカーが Google Cloud Logging にログエントリを書き込むことを許可します。

便宜上、これらの権限を含む事前定義ロールを使用できます。

roles/resourcemanager.projectIamAdmin

roles/iam.serviceAccountKeyAdmin

roles/spanner.instanceAdmin

roles/spanner.databaseAdmin

roles/storage.admin

roles/dataflow.serviceAgent

roles/dataflow.worker

roles/dataflow.serviceAgent

再利用可能なプロパティを設定する

このラボでは、いくつかの値を繰り返し使用します。これを簡単にするため、これらの値を後で使用するシェル変数に設定します。

  • GCP_REGION - GCP リソースが配置される特定のリージョン。リージョンのリストについては、こちらをご覧ください。
  • GCP_PROJECT - 使用する GCP プロジェクト ID。
  • GCP_BUCKET_NAME - 作成する GCS バケットの名前。データファイルが保存されます。
export GCP_REGION = <GCP REGION HERE> 
export GCP_PROJECT= <GCP PROJECT HERE>
export GCS_BUCKET_NAME = <GCS BUCKET NAME HERE>
export SPANNER_INSTANCE = <SPANNER INSTANCE ID HERE>
export SPANNER_DB = <SPANNER DATABASE ID HERE>

Google Cloud プロジェクト

プロジェクトは、Google Cloud の基本的な組織単位です。管理者が使用するものを指定している場合は、この手順をスキップできます。

プロジェクトは、次のように CLI を使用して作成できます。

gcloud projects create $GCP_PROJECT
gcloud config set project $GCP_PROJECT

プロジェクトの作成と管理について詳しくは、こちらをご覧ください。

Spanner を設定する

Spanner の使用を開始するには、インスタンスとデータベースをプロビジョニングする必要があります。Spanner インスタンスの構成と作成の詳細については、こちらをご覧ください。

インスタンスを作成する

gcloud spanner instances create $SPANNER_INSTANCE \
--config=regional-$GCP_REGION \
--description="Codelabs Snowflake RETL" \
--processing-units=100 \
--edition=ENTERPRISE

データベースを作成する

gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE

3. Google Cloud Storage バケットを作成する

Google Cloud Storage(GCS)は、Snowflake によって生成された Parquet データファイルと Iceberg メタデータの保存に使用されます。そのためには、まずファイルの宛先として使用する新しいバケットを作成する必要があります。ローカルマシンのターミナル ウィンドウで、次の手順を行います。

バケットを作成する

次のコマンドを使用して、特定のリージョン(us-central1 など)にストレージ バケットを作成します。

gcloud storage buckets create gs://$GCS_BUCKET_NAME --location=$GCP_REGION

バケットの作成を確認する

コマンドが正常に実行されたら、すべてのバケットを一覧表示して結果を確認します。新しいバケットが結果のリストに表示されます。バケット参照は通常、バケット名の前に gs:// プレフィックスが付いて表示されます。

gcloud storage ls | grep gs://$GCS_BUCKET_NAME

書き込み権限をテストする

この手順により、ローカル環境が正しく認証され、新しく作成されたバケットにファイルを書き込むために必要な権限が付与されます。

echo "Hello, GCS" | gcloud storage cp - gs://$GCS_BUCKET_NAME/hello.txt

アップロードしたファイルを確認する

バケット内のオブジェクトを一覧表示します。アップロードしたファイルのフルパスが表示されます。

gcloud storage ls gs://$GCS_BUCKET_NAME

次の出力が表示されます。

gs://$GCS_BUCKET_NAME/hello.txt

バケット内のオブジェクトの内容を表示するには、gcloud storage cat を使用します。

gcloud storage cat gs://$GCS_BUCKET_NAME/hello.txt

ファイルの内容が表示されるはずです。

Hello, GCS

テストファイルをクリーンアップする

これで、Cloud Storage バケットが設定されました。これで、一時テストファイルを削除できます。

gcloud storage rm gs://$GCS_BUCKET_NAME/hello.txt

出力で削除を確認します。

Removing gs://$GCS_BUCKET_NAME/hello.txt...
/ [1 objects]
Operation completed over 1 objects.

4. Snowflake から GCS へのエクスポート

このラボでは、意思決定支援システムの業界標準ベンチマークである TPC-H データセットを使用します。このスキーマは、顧客、注文、サプライヤー、部品を含む現実的なビジネス環境をモデル化しているため、実際の分析とデータ移動のシナリオをデモンストレーションするのに最適です。このデータセットは、すべての Snowflake アカウントでデフォルトで使用できます。

正規化された TPC-H テーブルをそのまま使用するのではなく、新しい集計テーブルを作成します。この新しいテーブルは、orderscustomernation テーブルのデータを結合して、全国の売上高の非正規化された概要ビューを生成します。この事前集計ステップは、特定のユースケース(このシナリオでは運用アプリケーションによる使用)向けにデータを準備するため、分析でよく行われる方法です。

Snowflake が Google Cloud Storage にアクセスできるようにする

Snowflake が GCS バケットにデータを書き込めるようにするには、外部ボリュームと必要な権限の 2 つを作成する必要があります。

  • 外部ボリュームは、GCS バケット内の特定のロケーションへの安全なリンクを提供する Snowflake オブジェクトです。データ自体は保存されませんが、Snowflake がクラウド ストレージにアクセスするために必要な構成が保持されます。
  • セキュリティのため、クラウド ストレージ バケットはデフォルトで非公開になっています。外部ボリュームが作成されると、Snowflake は専用のサービス アカウントを生成します。このサービス アカウントには、バケットに対する読み取りと書き込みの権限が付与されている必要があります。

データベースの作成

  1. 左側のメニューの [Horizon Catalog] で、[カタログ] にカーソルを合わせて [データベース エクスプローラ] をクリックします。
  2. [データベース] ページで、右上の [+ データベース] ボタンをクリックします。
  3. 新しいデータベースに codelabs_retl_db という名前を付けます。

ワークシートを作成する

データベースに対して SQL コマンドを実行するには、ワークシートが必要です。

ワークシートを作成するには:

  1. 左側のメニューの [データを操作する] で、[プロジェクト] にカーソルを合わせ、[ワークスペース] をクリックします。
  2. [マイ ワークスペース] サイドバーで、[+ 新規追加] ボタンをクリックし、[SQL ファイル] を選択します。

外部ボリュームを作成する

Snowflake ワークシートで次のコマンドを実行して、ボリュームを作成します。

CREATE EXTERNAL VOLUME codelabs_retl_ext_vol
STORAGE_LOCATIONS = 
(
  (
    NAME = 'codelabs_retl_ext_vol'
    STORAGE_PROVIDER = 'GCS'
    STORAGE_BASE_URL = 'gcs://<Your bucket name>/snowflake_extvol'
  )
); 

Snowflake サービス アカウントを取得する

DESC(describe)で、新しく作成された外部ボリュームを記述して、Snowflake が生成した一意のサービス アカウントを取得します。

DESC EXTERNAL VOLUME codelabs_retl_ext_vol;
  1. 結果ペインで、json プロパティを探し、"NAME":"codelabs_retl_ext_vol" で始まる JSON 文字列を保持する property_value エントリを見つけます。
  2. JSON オブジェクト内の STORAGE_GCP_SERVICE_ACCOUNT プロパティを見つけて、その値をコピーします(メールアドレスのような値になります)。これは、GCS バケットへのアクセスが必要なサービス アカウントの識別子です。
  3. 後で再利用できるように、このサービス アカウントをシェル インスタンスの環境変数に格納します。
export GCP_SERVICE_ACCOUNT=<Your service account>

Snowflake に GCS 権限を付与する

次に、Snowflake サービス アカウントに GCS バケットへの書き込み権限を付与する必要があります。

gcloud storage buckets add-iam-policy-binding gs://$GCS_BUCKET_NAME \
    --member="serviceAccount:$GCP_SERVICE_ACCOUNT" \
    --role="roles/storage.objectAdmin"

gcloud storage buckets add-iam-policy-binding gs://$GCS_BUCKET_NAME \
    --member="serviceAccount:$GCP_SERVICE_ACCOUNT" \
    --role="roles/storage.legacyBucketReader"

Snowflake でアクセス権を確認する

Snowflake ワークシートに戻り、次のコマンドを実行して、Snowflake が GCS バケットに正常に接続できることを確認します。

SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('codelabs_retl_ext_vol');

結果は "success":true を含む JSON オブジェクトである必要があります。

Snowflake の外部ボリュームの詳細については、公式ドキュメントをご覧ください。

サンプル注文データをエクスポートする

これで、Snowflake で Iceberg テーブルを作成できます。次のコマンドは、クエリを実行して、Iceberg 形式で結果を GCS に保存するように Snowflake に指示します。データファイルは Parquet 形式、メタデータは Avro 形式と JSON 形式で、すべて codelabs_retl_ext_vol 外部ボリュームで定義された場所に保存されます。

データベースの作成

  1. 左側のメニューの [Horizon Catalog] で、[カタログ] にカーソルを合わせて [データベース エクスプローラ] をクリックします。
  2. [データベース] ページで、右上の [+ データベース] ボタンをクリックします。
  3. 新しいデータベースに codelabs_retl_db という名前を付けます。
USE DATABASE codelabs_retl_db; 

CREATE ICEBERG TABLE REGIONAL_SALES_ICEBERG (
    NATION_NAME STRING,
    MARKET_SEGMENT STRING,
    ORDER_YEAR INTEGER,
    ORDER_PRIORITY STRING,
    TOTAL_ORDER_COUNT INTEGER,
    TOTAL_REVENUE NUMBER(24,2),
    UNIQUE_CUSTOMER_COUNT INTEGER
) 
EXTERNAL_VOLUME = 'codelabs_retl_ext_vol'
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'regional_sales_iceberg'
AS (
    SELECT 
        n.n_name AS nation_name,
        c.c_mktsegment AS market_segment,
        YEAR(o.o_orderdate) AS order_year,
        o.o_orderpriority AS order_priority,
        COUNT(o.o_orderkey) AS total_order_count,
        ROUND(SUM(o.o_totalprice), 2) AS total_revenue,
        COUNT(DISTINCT c.c_custkey) AS unique_customer_count
    FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.orders AS o
    INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.customer AS c 
        ON o.o_custkey = c.c_custkey
    INNER JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.nation AS n
        ON c.c_nationkey = n.n_nationkey
    GROUP BY 
        n.n_name, 
        c.c_mktsegment, 
        YEAR(o.o_orderdate), 
        o.o_orderpriority
);

Snowflake を使用した Iceberg テーブルの作成と管理の詳細については、公式ドキュメントをご覧ください。

GCP でデータを確認する

GCS バケットを確認します。Snowflake が作成したファイルが表示されます。これにより、エクスポートが成功したことを確認できます。Iceberg メタデータmetadata フォルダに、実際のデータは Parquet ファイルとして data フォルダにあります。

gcloud storage ls "gs://$GCS_BUCKET_NAME/snowflake_extvol/**"

ファイル名は異なりますが、構造は次のようになります。

gs://$GCS_BUCKET_NAME/snowflake_extvol/
gs://$GCS_BUCKET_NAME/snowflake_extvol/regional_sales_iceberg.snvrAWuR/data/snow_cbsKIRmdDmo_wLg128fugxg_0_2_009.parquet
...
gs://$GCS_BUCKET_NAME/snowflake_extvol/regional_sales_iceberg.snvrAWuR/metadata/00001-62f831ff-6708-4494-94c5-c891b7ad447f.metadata.json
...

これで、データが Snowflake から Google Cloud Storage に Iceberg 形式でコピーされました。

このリストがあるうちに、後で必要になるため、metadata.json ファイルを環境変数に保存しましょう。

export GCS_METADATA_JSON=$(gcloud storage ls "gs://$GCS_BUCKET_NAME/snowflake_extvol/**" | grep .metadata.json)

5. BigQuery 外部テーブルを構成する

Iceberg テーブルが Google Cloud Storage に保存されたので、次は BigQuery からアクセスできるようにします。これは、BigLake 外部テーブルを作成することで実現できます。

BigLake は、Google Cloud Storage などの外部ソースからデータを直接読み取る BigQuery でテーブルを作成できるストレージ エンジンです。このラボでは、データを取り込むことなく、BigQuery がエクスポートされた Iceberg テーブルを理解できるようにする重要なテクノロジーです。

これを機能させるには、次の 2 つのコンポーネントが必要です。

  1. Cloud リソース接続: BigQuery と GCS 間の安全なリンクです。認証を処理するために特別なサービス アカウントを使用し、BigQuery に GCS バケットからファイルを読み取るために必要な権限があることを確認します。
  2. 外部テーブル定義: これは、GCS で Iceberg テーブルのメタデータ ファイルを見つける場所と、その解釈方法を BigQuery に伝えます。

Google Cloud Storage への接続を構成する

まず、BigQuery が GCS にアクセスできるようにする接続が作成されます。このコマンドは、BigQuery 内に接続リソースを作成します。

bq mk \
  --connection \
  --project_id=$GCP_PROJECT \
  --location=$GCP_REGION \
  --connection_type=CLOUD_RESOURCE \
  codelabs-retl-connection

成功すると、次のような出力が表示されます。

Connection 12345678.region.codelabs-retl-connection successfully created

BigQuery の Cloud Resource 接続の詳細については、Google Cloud ドキュメントをご覧ください。

データを読み取るための BigQuery 接続を承認する

新しい BigQuery 接続には独自のサービス アカウントがあり、Google Cloud Storage バケットからデータを読み取る権限が必要です。

1. 接続サービス アカウントを取得する

まず、作成した接続からサービス アカウント ID を取得します。

bq show \
  --location $GCP_REGION \
  --connection codelabs-retl-connection

一致する接続の表が表示されます。

後で使用する環境変数に serviceAccountId を設定しましょう。

export GCP_BQ_SERVICE_ACCOUNT=<Your service account email>

2. 権限の付与

次のコマンドを実行して、GCS バケット内のデータを表示する権限をサービス アカウントに付与します。

gcloud storage buckets add-iam-policy-binding \
  gs://$GCS_BUCKET_NAME \
  --member serviceAccount:$GCP_BQ_SERVICE_ACCOUNT \
  --role roles/storage.objectViewer

外部テーブルを作成する

次に、BigQuery で BigLake 外部テーブルを作成します。このコマンドではデータは移動されません。これは、GCS 内の既存のデータへのポインタを作成するだけです。Snowflake が作成した .metadata.json ファイルのいずれかのパスが必要です。

bq mk --dataset --location=$GCP_REGION codelabs_retl

bq mk \
    --table \
    --location=$GCP_REGION \
--external_table_definition=ICEBERG=$GCS_METADATA_JSON@projects/$GCP_PROJECT/locations/$GCP_REGION/connections/codelabs-retl-connection \
    codelabs_retl.regional_sales

BigQuery でデータを確認する

このテーブルは、他の BigQuery テーブルと同様に、標準 SQL を使用してクエリできるようになりました。BigQuery は、この接続を使用して、GCS から Parquet ファイルをオンザフライで読み取ります。

bq query \
  --location=$GCP_REGION \
  --nouse_legacy_sql "SELECT * FROM \`$GCP_PROJECT.codelabs_retl.regional_sales\` LIMIT 10;"

6. BigQuery から Spanner へのデータのインポート: 最終ステップ

パイプラインの最終的かつ最も重要な部分である、BigLake テーブルから Spanner へのデータの移動が完了しました。これは「リバース ETL」ステップです。データ ウェアハウスで処理およびキュレーションされたデータが、アプリケーションで使用するために運用システムに読み込まれます。

Spanner は、グローバルに分散されたフルマネージドのリレーショナル データベースです。従来のリレーショナル データベースのトランザクション整合性を備えながら、NoSQL データベースの水平方向のスケーラビリティも実現しています。そのため、スケーラブルで可用性の高いアプリケーションの構築に最適です。

プロセスは次のとおりです。

  1. データの構造と一致するテーブル スキーマを Spanner データベースに作成します。
  2. BigQuery の EXPORT DATA クエリを実行して、BigLake テーブルから Spanner テーブルにデータを直接読み込みます。

Spanner テーブルを作成する

BigQuery からデータを転送する前に、互換性のあるスキーマを使用して Spanner に宛先テーブルを作成する必要があります。

gcloud spanner databases ddl update $SPANNER_DB \
  --instance=$SPANNER_INSTANCE \
  --ddl="$(cat <<EOF
CREATE TABLE regional_sales (
    nation_name STRING(MAX),
    market_segment STRING(MAX),
    order_year INT64,
    order_priority STRING(MAX),
    total_order_count INT64,
    total_revenue NUMERIC,
    unique_customer_count INT64
) PRIMARY KEY (nation_name, market_segment, order_year, order_priority);
EOF
)"

BigQuery からデータをエクスポートする

これが最後の手順です。BigQuery BigLake テーブルにソースデータが用意され、Spanner に宛先テーブルが作成されると、実際のデータ移動は驚くほど簡単です。単一の BigQuery SQL クエリ EXPORT DATA が使用されます。

このクエリは、このようなシナリオ専用に設計されています。BigQuery テーブル(BigLake テーブルなどの外部テーブルを含む)から外部宛先にデータを効率的にエクスポートします。この場合、宛先は Spanner テーブルです。

bq query --location=$GCP_REGION --use_legacy_sql=false <<EOF
EXPORT DATA OPTIONS (
uri="https://spanner.googleapis.com/projects/${GCP_PROJECT}/instances/${SPANNER_INSTANCE}/databases/${SPANNER_DB}",
  format='CLOUD_SPANNER',
  spanner_options="""{ 
      "table": "regional_sales", 
      "priority": "HIGH" 
      }"""
) AS 
SELECT * FROM \`${PROJECT_ID}.codelabs_retl.regional_sales\`
EOF

クエリが完了すると、[結果] ペインに「更新が完了しました」と表示されます。

7. Spanner でデータを確認する

おめでとうございます!完全な Reverse ETL パイプラインが正常に構築され、実行されました。最後のステップは、データが想定どおりに Spanner に届いたことを確認することです。

gcloud spanner databases execute-sql \
  --instance=$SPANNER_INSTANCE \
  $SPANNER_DB \
  --sql='SELECT * FROM regional_sales LIMIT 10'

インポートされたサンプルデータがリクエストどおりに表示されます。

nation_name  market_segment  order_year  order_priority   total_order_count  total_revenue  unique_customer_count
ALGERIA      AUTOMOBILE      1992        1-URGENT         375                59232423.66    298
ALGERIA      AUTOMOBILE      1992        2-HIGH           328                47371891.08    269
ALGERIA      AUTOMOBILE      1992        3-MEDIUM         346                52823195.87    262
ALGERIA      AUTOMOBILE      1992        4-NOT SPECIFIED  365                52935998.34    288
ALGERIA      AUTOMOBILE      1992        5-LOW            380                54920263.68    293
ALGERIA      AUTOMOBILE      1993        1-URGENT         394                63145618.78    312
ALGERIA      AUTOMOBILE      1993        2-HIGH           340                50737488.4     277
ALGERIA      AUTOMOBILE      1993        3-MEDIUM         383                55871057.46    298
ALGERIA      AUTOMOBILE      1993        4-NOT SPECIFIED  365                56424662.05    291
ALGERIA      AUTOMOBILE      1993        5-LOW            363                54673249.06    283

分析データと運用データのギャップを埋めることに成功しました。

8. クリーンアップ

Spanner をクリーンアップする

Spanner データベースとインスタンスを削除する

gcloud spanner instances delete $SPANNER_INSTANCE

GCS をクリーンアップする

データをホストするために作成した GCS バケットを削除する

gcloud storage rm --recursive gs://$GCS_BUCKET_NAME

BigQuery をクリーンアップする

bq rm -r codelabs_retl
bq rm --connection --location=$GCP_REGION codelabs-retl-connection

Snowflake をクリーンアップする

データベースをドロップ

  1. 左側のメニューの [Horizon Catalog] で、[Catalog] にカーソルを合わせて [Database Explorer] をクリックします。
  2. CODELABS_RETL_DB データベースの右側にある [...] をクリックしてオプションを展開し、[削除] を選択します。
  3. ポップアップ表示される確認ダイアログで、[Drop Database] を選択します。

ワークブックを削除する

  1. 左側のメニューの [データを操作する] で、[プロジェクト] にカーソルを合わせ、[ワークスペース] をクリックします。
  2. [マイ ワークスペース] サイドバーで、このラボで使用したさまざまなワークスペース ファイルにカーソルを合わせ、[...] の追加オプションを表示してクリックします。
  3. [削除] を選択し、表示された確認ダイアログで [削除] をもう一度選択します。
  4. このラボで作成したすべての SQL ワークスペース ファイルに対して、この操作を行います。

外部ボリュームを削除する

  1. 左側のメニューの [Horizon Catalog] で、[カタログ] にカーソルを合わせ、[外部データ] をクリックします。
  2. CODELABS_RETL_EXT_VOL の右にある 227b3e306c3d609d.png をクリックし、[外部ボリュームを削除] を選択して、確認ダイアログで [外部ボリュームを削除] をもう一度クリックします。

9. 完了

以上で、この Codelab は完了です。

学習した内容

  • Snowflake にデータを読み込む方法
  • GCS バケットの作成方法
  • Snowflake テーブルを CSV 形式で GCS にエクスポートする方法
  • Spanner インスタンスを設定する方法
  • Dataflow を使用して CSV テーブルを Spanner に読み込む方法