次の方法で共有


Google ビッグクエリ(Google BigQuery)

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

重要

従来のクエリフェデレーションドキュメントは廃止され、更新されない可能性があります。 このコンテンツに記載されている構成は、Databricks によって公式に承認またはテストされていません。 Lakehouse Federation がソース データベースをサポートしている場合、Databricks では代わりにこれを使用することをお勧めします。

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

権限

プロジェクトには、BigQuery を使用して読み書きするための特定の Google アクセス許可が必要です。

この記事では、BigQuery の具体化されたビューについて説明します。 詳細については、Google の記事「 具体化されたビューの概要」を参照してください。 他の BigQuery 用語と BigQuery セキュリティ モデルについては、 Google BigQuery のドキュメントを参照してください。

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

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

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

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

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

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

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

Azure Databricks タスク プロジェクトで必要な Google のアクセス許可
具体化されたビューを使用せずに BigQuery テーブルを読み取る project プロジェクトで次の手順を実行します。
  • BigQuery 読み取りセッションユーザー
  • BigQuery データ ビューアー (必要に応じて、プロジェクト レベルではなくデータセット/テーブル レベルでこれを許可)
具体化されたビューを使用して BigQuery テーブルを読み取る project プロジェクトで次の手順を実行します。
  • BigQuery ジョブ ユーザー
  • BigQuery 読み取りセッションユーザー
  • BigQuery データ ビューアー (必要に応じて、プロジェクト レベルではなくデータセット/テーブル レベルでこれを許可)

具体化プロジェクトで次の手順を実行します。
  • BigQuery データ エディター
BigQuery テーブルを作成する project プロジェクトで次の手順を実行します。
  • BigQuery ジョブ ユーザー
  • BigQuery データ エディター

projectparentProjectが異なる場合に必要なアクセス許可

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

Azure 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 を有効にする

gcloud services enable bigquerystorage.googleapis.com

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

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

  2. [ API とサービスの有効化 ] ボタンをクリックします。

    Google Enable Services

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

    Google BigQuery Storage

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

    Google BigQuery

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

Azure Databricks クラスターのサービス アカウントを作成します。 Databricks では、このサービス アカウントにタスクを実行するために必要な最小限の特権を付与することをお勧めします。 「BigQuery のロールとアクセス許可」を参照してください。

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

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

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. [ + サービス アカウントの作成] をクリックします。

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

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

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

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

    Google のアクセス許可

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

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

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

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

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

    Google Create Key

  3. JSON キーの種類を受け入れます。

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

    重要

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

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

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

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

  2. [ バケットの作成] をクリックします。

    Google Create Bucket

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

    Google バケットの詳細

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

  5. [ アクセス許可 ] タブと [ メンバーの追加] をクリックします。

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

    Google バケットのアクセス許可

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

手順 2: Azure Databricks を設定する

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

クラスターを構成する場合:

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

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 から外部テーブルを作成する

重要

この機能は Unity カタログではサポートされていません。

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

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 テーブルを Azure Databricks DataFrame に読み込みます。

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

ノートブックを入手

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

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

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

ノートブックを入手