概要
Databricks にて BigQuery から Spark-BQ コネクター(Apache Spark SQL connector for Google BigQuery)によりビューを参照する際に必要となる Google Cloud の権限に関する検証結果を共有します。検証の結果、下記の権限が必要となります。
- BigQuery Data Editor
- BigQuery Job User
- BigQuery Read Session User
Databricks Federation の動作も確認しています。Databricks Runtime 16.1 以降のクラスターでは Spark Connector が利用される仕様変更がされたため、 16.4 と 15.4 のバージョンでそれぞれ実行しています。仕様変更内容について下記の記事で整理しています。
本記事は下記シリーズの一部です。
出所:Databricks で BigQuery のデータを取得する方法の徹底ガイド - Qiita
事前準備
BigQuery にオブジェクトを作成
-- データセットを作成
CREATE SCHEMA IF NOT EXISTS `auth_test_02`;
-- テーブルを作成
CREATE OR REPLACE TABLE `auth_test_02.table_01` AS
SELECT *
FROM UNNEST([
STRUCT(1 AS id, 'Alice' AS name, 100 AS score),
STRUCT(2 AS id, 'Bob' AS name, 95 AS score),
STRUCT(3 AS id, 'Carol' AS name, 98 AS score)
]);
-- ビューを作成
CREATE OR REPLACE VIEW `auth_test_02.view_01` AS
SELECT * FROM `auth_test_02.table_01`;
SELECT * FROM `auth_test_02.view_01`;
サービスアカウント作後にキーを取得
BigQuery を Databricks の外部カタログに登録
Databricks にてノートブック作成後に実行するコードを記述
json_str = b"""{json_key}"""
import base64
encoded_string = base64.b64encode(json_str).decode('utf-8')
# プロジェクト ID を設定
parent_project_id = "axial-triode-368703"
# データ取得元のテーブル名を設定
table_name = "auth_test_02.view_01"
df = (
spark.read
.format("bigquery")
.option("parentProject", parent_project_id)
.option("credentials", encoded_string)
.option("viewsEnabled", True)
.option("table",table_name)
.load()
)
df.limit(50).display()
権限検証
BigQuery Data Viewer
権限の追加
権限不足によるエラーが発生します。
Py4JJavaError: An error occurred while calling t.addCustomDisplayData.
: bigquery.storageapi.shaded.com.google.cloud.bigquery.connector.common.BigQueryConnectorException: Error creating destination table using the following query: [SELECTid
,name
,score
FROMaxial-triode-368703.auth_test_02.view_01
]
Caused by: bigquery.storageapi.shaded.com.google.cloud.spark.bigquery.repackaged.com.google.common.util.concurrent.UncheckedExecutionException: bigquery.storageapi.shaded.com.google.cloud.spark.bigquery.repackaged.com.google.cloud.bigquery.BigQueryException: Access Denied: Project axial-triode-368703: User does not have bigquery.jobs.create permission in project axial-triode-368703.
BigQuery Job User
権限の追加
権限不足によるエラーが発生します。
Py4JJavaError: An error occurred while calling t.addCustomDisplayData.
: bigquery.storageapi.shaded.com.google.cloud.bigquery.connector.common.BigQueryConnectorException: Error creating destination table using the following query: [SELECTid
,name
,score
FROMaxial-triode-368703.auth_test_02.view_01
]
Caused by: bigquery.storageapi.shaded.com.google.cloud.spark.bigquery.repackaged.com.google.common.util.concurrent.UncheckedExecutionException: bigquery.storageapi.shaded.com.google.cloud.spark.bigquery.repackaged.com.google.cloud.bigquery.BigQueryException: Access Denied: Dataset axial-triode-368703:auth_test_02: Permission bigquery.tables.create denied on dataset axial-triode-368703:auth_test_02 (or it may not exist).
BigQuery Data Viewer
権限をBigQuery Data Editor
権限に変更
権限不足によるエラーが発生します。
Py4JJavaError: An error occurred while calling t.addCustomDisplayData.
: bigquery.storageapi.shaded.com.google.cloud.spark.bigquery.repackaged.com.google.api.gax.rpc.PermissionDeniedException: bigquery.storageapi.shaded.com.google.cloud.spark.bigquery.repackaged.io.grpc.StatusRuntimeException: PERMISSION_DENIED: request failed: the user does not have 'bigquery.readsessions.create' permission for 'projects/axial-triode-368703'
BigQuery Read Session User
権限の追加
データを取得できます。
Databricks Lakehouse Fedearation の検証
Databricks Runtime 16.4 での実行可否確認
データを取得できます。
Databricks Runtime 15.4 での実行可否確認
データを取得できます。