Databricks にて BigQuery のビューを参照する際の Access Denied エラーに対する対応方法

## 概要

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: [SELECT `id`,`name`,`score` FROM `axial-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.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ec6365bd-e376-404d-b54b-46ceb7a6af2f.png)

テーブルのデータセット自体には権限を付与しない前提で、次の2つの方法で対応可能です。

1. `Authorize Datasets` を設定する
2. `Authorize View` を設定する

本記事では、エラー発生時の状況とそれに対する対応策を紹介します。

本記事は下記シリーズの一部です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1bb4805e-9f67-49e9-8e72-36036bf4310c.png)

出所：[Databricks で BigQuery のデータを取得する方法の徹底ガイド - Qiita](https://qiita.com/manabian/items/7097a9c31de23752d58a)

## 事前準備

### BigQuery でテーブルとビューを別々のデータセットに作成

```sql
-- テーブルを作成
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`;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e52af605-17e1-4249-b1e7-a3ea9964d91f.png)

### サービスアカウント作成後にキーを発行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3d58d388-9a25-4b26-ae44-fd75a69eef0c.png)

### プロジェクトレベルで `BigQuery Job User` と `BigQuery Read Session User` を付与

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e02821df-6444-4a6a-a6a6-01234f10a840.png)

### ビューのデータセットに対して `BigQuery Data Editor` を付与

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e9019952-2c9a-49cd-bea7-a34ee157f1ba.png)

## エラーの発生方法

### 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: [SELECT `id`,`name`,`score` FROM `axial-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.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ec6365bd-e376-404d-b54b-46ceb7a6af2f.png)

## 対応方法

### 1. `Authorize Datasets` を設定する

#### 1-1. ソースのデータセット画面で `Sharing` -> `Authorize Datasets` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3faea1c0-1e4a-4da9-b1fa-b8cae6678ac8.png)

#### 1-2. ビューのデータセットを指定し、`Add Authorization` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/65503b1f-5f4f-470a-8cc3-9fcfc42d25e2.png)

#### 1-3. Databricks でデータが取得できることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a7df918a-a2f9-4609-a4ec-efc8375209ad.png)

### 2. `Authorize View` を設定する

#### 2-1. ソースのデータセット画面で `Sharing` -> `Authorize Views` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f003c26d-086c-4228-83a3-09741fe3e9e3.png)

#### 2-2. ビューを指定し、`Add Authorization` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/13e1b01c-c53a-439d-9a29-4a5cf96bd73f.png)

#### 2-3. Databricks でデータが取得できることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ac7d3df7-0fae-481c-80d6-4a92d9a6a21e.png)