概要
BigQuery でテーブルとビューが異なるデータセットにある場合、ビュー(またはビューのデータセット)に対してのみ参照権限を付与すると、下記のようなエラーが発生することがあります。
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.view_dataset_01.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: Table axial-triode-368703:source_dataset_01.table_01: User does not have permission to query table axial-triode-368703:source_dataset_01.table_01, or perhaps it does not exist.
テーブルのデータセット自体には権限を付与しない前提で、次の2つの方法で対応可能です。
-
Authorize Datasets
を設定する -
Authorize View
を設定する
本記事では、エラー発生時の状況とそれに対する対応策を紹介します。
本記事は下記シリーズの一部です。
出所:Databricks で BigQuery のデータを取得する方法の徹底ガイド - Qiita
事前準備
BigQuery でテーブルとビューを別々のデータセットに作成
-- テーブルを作成
CREATE SCHEMA IF NOT EXISTS `source_dataset_01`;
CREATE OR REPLACE TABLE `source_dataset_01.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 SCHEMA IF NOT EXISTS `view_dataset_01`;
CREATE OR REPLACE VIEW `view_dataset_01.view_01` AS
SELECT * FROM `source_dataset_01.table_01`;
SELECT * FROM `view_dataset_01.view_01`;
サービスアカウント作成後にキーを発行
プロジェクトレベルで BigQuery Job User
と BigQuery Read Session User
を付与
ビューのデータセットに対して BigQuery Data Editor
を付与
エラーの発生方法
Databricks で BigQuery のビューを参照
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.view_dataset_01.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: Table axial-triode-368703:source_dataset_01.table_01: User does not have permission to query table axial-triode-368703:source_dataset_01.table_01, or perhaps it does not exist.