Spanner にデータをエクスポートする(リバース ETL)
この機能に関するフィードバックやサポートのリクエストを行う場合は、bq-cloud-spanner-federation-preview@google.com までご連絡ください。
このドキュメントでは、BigQuery から Spanner への逆方向の抽出、変換、読み込み(リバース ETL)ワークフローを設定する方法について説明します。これを行うには、EXPORT DATA
ステートメントを使用して、BigQuery テーブルから Spanner テーブルにデータをエクスポートします。
このリバース ETL ワークフローは、BigQuery の分析機能と Spanner の低レイテンシと高スループットを組み合わせたものです。このワークフローでは、BigQuery の割り当てと上限を使い切ることなく、アプリケーション ユーザーにデータを配信できます。
始める前に
- このドキュメントの各タスクを実行するために必要な権限をユーザーに与える Identity and Access Management(IAM)のロールを付与します。
必要なロール
BigQuery データを Spanner にエクスポートするために必要な権限を取得するには、プロジェクトに対して次の IAM ロールを付与するよう管理者に依頼してください。
-
BigQuery テーブルからデータをエクスポートする: BigQuery データ閲覧者(
roles/bigquery.dataViewer
) -
エクスポート ジョブを実行する: BigQuery ユーザー (
roles/bigquery.user
) -
Spanner テーブルにデータを書き込む: Cloud Spanner データベース ユーザー(
roles/spanner.databaseUser
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
制限事項
次の BigQuery データ型は Spanner に同等のものがなく、サポートされていません。
Spanner データベース言語 | サポートされていない BigQuery の型 |
---|---|
すべての言語 |
|
GoogleSQL |
|
エクスポートされる行の最大サイズは 1 MiB です。
spanner_options
オプションを使用してエクスポートを構成する
spanner_options
オプションを使用して、宛先の Spanner データベースとテーブルを指定できます。構成は、次の例に示すように、JSON 文字列の形式で表現されます。
EXPORT DATA OPTIONS( uri="https://spanner.googleapis.com/projects/PROJECT_ID
/instances/INSTANCE_ID
/databases/DATABASE_ID
", format='CLOUD_SPANNER', spanner_options = """{ "table": "TABLE_NAME
", "priority": "PRIORITY
", "tag": "TAG
", }""" )
次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクトの名前。INSTANCE_ID
: データベース インスタンスの名前。DATABASE_ID
: データベースの名前。TABLE_NAME
: 既存の宛先テーブルの名前。PRIORITY
(省略可): 書き込みリクエストの優先度。使用できる値:LOW
、MEDIUM
、HIGH
。デフォルト値:MEDIUM
。TAG
(省略可): Spanner モニタリングでエクスポータ トラフィックを識別するために使用されるリクエストタグ。デフォルト値:bq_export
。
エクスポート クエリの要件
クエリ結果を Spanner にエクスポートするには、結果が次の要件を満たしている必要があります。
- 結果セット内のすべての列が宛先テーブルに存在し、型が一致している必要があります。
- 結果セットには、宛先テーブルのすべての
NOT NULL
列が含まれている必要があります。 - 列の値は、Spanner のテーブル内のデータサイズの上限を超えないようにする必要があります。
- サポートされていない列の型は、Spanner にエクスポートする前に、サポートされている型のいずれかに変換する必要があります。
データをエクスポートする
EXPORT DATA
ステートメントを使用して、BigQuery テーブルから Spanner テーブルにデータをエクスポートできます。
次の例では、mydataset.table1
という名前のテーブルから選択したフィールドをエクスポートします。
EXPORT DATA OPTIONS ( uri="https://spanner.googleapis.com/projects/PROJECT_ID
/instances/INSTANCE_ID
/databases/DATABASE_ID
", format='CLOUD_SPANNER', spanner_options="""{ "table": "TABLE_NAME" }""" ) AS SELECT * FROM mydataset.table1;
次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクトの名前INSTANCE_ID
: データベース インスタンスの名前DATABASE_ID
: データベースの名前TABLE_NAME
: 既存の宛先テーブルの名前
エクスポートの最適化
BigQuery から Spanner へのレコードのエクスポートを最適化するには、次の方法を試してください。
Spanner 宛先インスタンスのノード数を増やす。エクスポータは、Spanner ノードと処理ユニットの数に比例して BigQuery エクスポート スロット数を自動的にスケーリングします。書き込みスループットを最大化する方法の詳細については、パフォーマンスの概要をご覧ください。
クエリ結果を並べ替えないでください。結果セットにすべての主キー列が含まれている場合は、エクスポータが宛先テーブルの主キーを自動的に並べ替えて、書き込みを合理化し、競合を最小限に抑えます。
宛先テーブルの主キーに生成された列が含まれている場合は、生成された列の式をクエリに追加して、エクスポートされたデータが適切に並べ替えられるようにする必要があります。
料金
データ エクスポートの料金の詳細については、BigQuery の料金をご覧ください。
データのエクスポート後、Spanner にデータを保存すると料金が発生します。詳細については、Spanner の料金をご覧ください。