メインコンテンツまでスキップ

グーグルBigQuery

この記事では、Databricks で Google BigQuery テーブルの読み取りと書き込みを行う方法について説明します。

備考

実験段階

この記事で説明する構成は 試験段階です。 試験的な機能は現状のまま提供され、 Databricks を通じて顧客のテクニカル サポートを通じてサポートされることはありません。 クエリ フェデレーションを完全にサポートするには、代わりに レイクハウスフェデレーションを使用して、 Databricks ユーザーが Unity Catalog 構文ツールとデータガバナンス ツールを利用できるようにする必要があります。

BigQuery には、キーベースの認証を使用して接続する必要があります。

権限

プロジェクトには、BigQuery を使用して読み取りと書き込みを行うための特定の Google 権限が必要です。

注記

この記事では、BigQuery のマテリアライズド ビューについて説明します。 詳細については、Google の記事「 マテリアライズドビューの概要」を参照してください。 その他の BigQuery の用語と BigQuery のセキュリティモデルについては、 Google BigQuery のドキュメントをご覧ください。

BigQuery でのデータの読み取りと書き込みは、次の 2 つの Google Cloud プロジェクトに依存します。

  • プロジェクト (project): Databricks が BigQuery テーブルを読み書きする元の Google Cloud プロジェクトの ID。
  • 親プロジェクト (parentProject): 親プロジェクトの ID で、読み取りと書き込みに対して課金する Google Cloud プロジェクト ID。 これを、キーを生成する Google サービス アカウントに関連付けられている Google Cloud プロジェクトに設定します。

BigQuery にアクセスするコードでは、 projectparentProject の値を明示的に指定する必要があります。 次のようなコードを使用します。

Python
spark.read.format("bigquery") \
.option("table", table) \
.option("project", <project-id>) \
.option("parentProject", <parent-project-id>) \
.load()

Google Cloud プロジェクトに必要な権限は、 projectparentProject が同じかどうかによって異なります。 次のセクションでは、各シナリオに必要なアクセス許可を示します。

projectparentProject が一致する場合に必要なアクセス許可

projectparentProjectの ID が同じ場合は、次の表を使用して最小限のアクセス許可を決定します。

Databricks タスク

プロジェクトに必要な Google の権限

マテリアライズド ビューを使用せずに BigQuery テーブルを読み取る

project プロジェクトでは、次の操作を行います。

  • BigQuery 読み取りセッション ユーザー
  • BigQuery データビューア(必要に応じて、プロジェクト レベルではなくデータセット / テーブル レベルで付与します)

マテリアライズド ビューで BigQuery テーブルを読み取る

project プロジェクトでは、次の操作を行います。

  • BigQuery ジョブ ユーザー
  • BigQuery 読み取りセッション ユーザー
  • BigQuery データビューア(必要に応じて、プロジェクト レベルではなくデータセット / テーブル レベルで付与します)

マテリアライズプロジェクトでは、

  • BigQuery データ エディタ

BigQuery テーブルを作成する

project プロジェクトでは、次の操作を行います。

  • BigQuery ジョブ ユーザー
  • BigQuery データ エディタ

projectparentProjectが異なる場合に必要な権限

projectparentProjectの ID が異なる場合は、次の表を使用して最小限のアクセス許可を決定します。

Databricks タスク

Google の権限が必要

マテリアライズド ビューを使用せずに BigQuery テーブルを読み取る

parentProject プロジェクトでは、次の操作を行います。

  • BigQuery 読み取りセッション ユーザー

project プロジェクトでは、次の操作を行います。

  • BigQuery データビューア(必要に応じて、プロジェクト レベルではなくデータセット / テーブル レベルで付与します)

マテリアライズド ビューで BigQuery テーブルを読み取る

parentProject プロジェクトでは、次の操作を行います。

  • BigQuery 読み取りセッション ユーザー
  • BigQuery ジョブ ユーザー

project プロジェクトでは、次の操作を行います。

  • BigQuery データビューア(必要に応じて、プロジェクト レベルではなくデータセット / テーブル レベルで付与します)

マテリアライズプロジェクトでは、

  • BigQuery データ エディタ

BigQuery テーブルを作成する

parentProject プロジェクトでは、次の操作を行います。

  • BigQuery ジョブ ユーザー

project プロジェクトでは、次の操作を行います。

  • BigQuery データ エディタ

ステップ 1: Google Cloud を設定する

BigQuery Storage API を有効にする

BigQuery Storage API は、BigQuery が有効になっている新しい Google Cloud プロジェクトではデフォルトで有効になっています。 ただし、既存のプロジェクトがあり、BigQuery Storage API が有効になっていない場合は、このセクションのステップに沿って有効にしてください。

BigQuery Storage API は、Google Cloud CLI または Google Cloud Console を使用して有効にできます。

Google Cloud CLI を使用して BigQuery Storage API を有効にする

Bash
gcloud services enable bigquerystorage.googleapis.com

Google Cloud Console を使用して BigQuery Storage API を有効にする

  1. 左側のナビゲーション ウィンドウで [APIs & サービス ] をクリックします。

  2. [ENABLE APIS AND サービス ] ボタンをクリックします。

    Google Enable サービス

  3. 検索バーに「 bigquery storage api 」と入力し、最初の結果を選択します。

    Google BigQuery ストレージ

  4. BigQuery Storage API が有効になっていることを確認します。

    Google BigQuery

Databricks の Google サービス アカウントを作成する

Databricks クラスタリング用のサービス アカウントを作成します。Databricks では、このサービス アカウントに、タスクを実行するために必要な最小限の特権を付与することをお勧めします。 BigQuery のロールと権限をご覧ください。

サービスアカウントは、Google Cloud CLI または Google Cloud コンソールを使用して作成できます。

Google Cloud CLI を使用して Google サービス アカウントを作成する

Bash
gcloud iam service-accounts create <service-account-name>

gcloud projects add-iam-policy-binding <project-name> \
--role roles/bigquery.user \
--member="serviceAccount:<service-account-name>@<project-name>.iam.gserviceaccount.com"

gcloud projects add-iam-policy-binding <project-name> \
--role roles/bigquery.dataEditor \
--member="serviceAccount:<service-account-name>@<project-name>.iam.gserviceaccount.com"

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

gcloud iam service-accounts keys create --iam-account \
"<service-account-name>@<project-name>.iam.gserviceaccount.com" \
<project-name>-xxxxxxxxxxx.json

Google Cloud Console を使用して Google サービス アカウントを作成する

アカウントを作成するには:

  1. 左側のナビゲーション・ペインで「 IAMおよび管理 」をクリックします。

  2. 「サービスアカウント」 をクリックします。

  3. [+ CREATE サービス アカウント ] をクリックします。

  4. サービスアカウントの名前と説明を入力します。

    Google がサービス アカウントを作成

  5. [ 作成 ]をクリックします。

  6. サービスアカウントの役割を指定します。 [ ロールの選択 ] ドロップダウンに「 BigQuery 」と入力し、次のロールを追加します。

    Googleの権限

  7. 続行 」をクリックします。

  8. [ 完了] をクリックします。

サービスアカウントのキーを作成するには:

  1. [サービス アカウント] の一覧で、新しく作成したアカウントをクリックします。

  2. [キー] セクションで、[ キーの追加] > [新しいキーの作成 ] ボタンを選択します。

    Google Create キー

  3. JSON キータイプを受け入れます。

  4. [作成 ] をクリックします。JSONキーファイルがコンピューターにダウンロードされます。

important

サービス アカウント用に生成する JSON キー ファイルは、Google Cloud アカウントのデータセットとリソースへのアクセスを制御するため、許可されたユーザーとのみ共有する必要がある秘密鍵です。

一時ストレージ用の Google Cloud Storage (GCS) バケットを作成する

BigQuery にデータを書き込むには、データソースが GCS バケットにアクセスできる必要があります。

  1. 左側のナビゲーション ウィンドウで [ストレージ ] をクリックします。

  2. バケットを作成 」をクリックします。

    Google Create バケット

  3. バケットの詳細を設定します。

    Googleバケットの詳細

  4. [ 作成 ]をクリックします。

  5. [権限 ] タブをクリックし、[ メンバーの追加] をクリックします。

  6. バケットのサービスアカウントに次のアクセス許可を付与します。

    Google バケットの権限

  7. [ 保存 ]をクリックします。

ステップ 2: Databricks を設定する

BigQueryテーブルにアクセスするようにクラスタリングを設定するには、JSONキーファイルをSpark設定として指定する必要があります。ローカルツールを使用して、JSONキーファイルをBase64エンコードします。 セキュリティ上の理由から、キーにアクセスできる可能性のあるWebベースまたはリモートツールを使用しないでください。

クラスタリングを構成する場合:

[ Spark Config ] タブで、次の Spark 設定を追加します。 <base64-keys> を Base64 でエンコードされた JSON キーファイルの文字列に置き換えます。括弧内の他の項目 ( <client-email>など) を、JSON キーファイルのフィールドの値に置き換えます。

ini
credentials <base64-keys>

spark.hadoop.google.cloud.auth.service.account.enable true
spark.hadoop.fs.gs.auth.service.account.email <client-email>
spark.hadoop.fs.gs.project.id <project-id>
spark.hadoop.fs.gs.auth.service.account.private.key <private-key>
spark.hadoop.fs.gs.auth.service.account.private.key.id <private-key-id>

BigQuery テーブルの読み取りと書き込み

BigQuery テーブルを読み取るには、次のように指定します

df = spark.read.format("bigquery") \
.option("table",<table-name>) \
.option("project", <project-id>) \
.option("parentProject", <parent-project-id>) \
.load()

BigQuery テーブルに書き込むには、次のように指定します。

df.write.format("bigquery") \
.mode("<mode>") \
.option("temporaryGcsBucket", "<bucket-name>") \
.option("table", <table-name>) \
.option("project", <project-id>) \
.option("parentProject", <parent-project-id>) \
.save()

ここで、 <bucket-name>、一時ストレージ用の Google Cloud Storage (GCS) バケットを作成するで作成したバケットの名前です。 <project-id><parent-id> の値の要件については、権限を参照してください。

BigQuery から外部テーブルを作成する

important

この機能は Unity Catalog ではサポートされていません。

Databricksでアンマネージドテーブルを宣言して、BigQueryから直接データを読み取ることができます。

SQL
CREATE TABLE chosen_dataset.test_table
USING bigquery
OPTIONS (
parentProject 'gcp-parent-project-id',
project 'gcp-project-id',
temporaryGcsBucket 'some-gcp-bucket',
materializationDataset 'some-bigquery-dataset',
table 'some-bigquery-dataset.table-to-copy'
)

Python ノートブックの例: Google BigQuery テーブルを DataFrame に読み込む

次の Python ノートブックは、Google BigQuery テーブルを Databricks DataFrame に読み込みます。

Google BigQuery Python サンプル ノートブック

Open notebook in new tab

Scala ノートブックの例: Google BigQuery テーブルを DataFrame に読み込む

次の Scala ノートブックは、Google BigQuery テーブルを Databricks DataFrame に読み込みます。

Google BigQuery Scala サンプル ノートブック

Open notebook in new tab