Google BigQuery
本文說明如何在 Azure Databricks 中讀取和寫入 Google BigQuery 資料表。
重要
本文所述的設定為實驗性質。 實驗性功能是以現況提供,且無法透過客戶技術支援來支援 Databricks。 若要取得完整的查詢同盟支援,您應該改用 Lakehouse 同盟,這可讓您的 Azure Databricks 使用者利用 Unity 目錄語法和資料控管工具。
您必須使用金鑰型驗證來連線到 BigQuery。
權限
您的專案必須具有特定的 Google 權限,才能使用 BigQuery 來讀取和寫入。
注意
本文將討論 BigQuery 具體化檢視。 如需詳細資料,請參閱具體化檢視簡介 (英文) Google文章。 若要瞭解其他 BigQuery 術語和 BigQuery 資訊安全模型,請參閱 Google BigQuery 文件。
若要使用 BigQuery 讀取和寫入資料,關鍵將取決於兩個 Google Cloud 專案:
- 專案 (
project
):Azure Databricks 可以從中讀取或寫入 BigQuery 資料表的 Google Cloud 專案識別碼。 - 父系專案 (
parentProject
):父系專案的識別碼,這是用於讀取和寫入的 Google Cloud 專案識別碼。 將此設定為 Google Cloud 專案,這是與您用於產生金鑰之 Google 服務帳戶相關聯的專案。
您必須在存取 BigQuery 的程式碼中明確提供 project
和 parentProject
值。 請使用與下列類似的程式碼:
spark.read.format("bigquery") \
.option("table", table) \
.option("project", <project-id>) \
.option("parentProject", <parent-project-id>) \
.load()
Google Cloud 專案所需的權限取決於 project
和 parentProject
是否相同。 下列各節會列出每個案例的必要權限。
如果 project
和 parentProject
相符,則需要權限
如果 project
和 parentProject
的識別碼相同,請使用下列資料表來判斷最低權限:
Azure Databricks 工作 | 專案中所需的 Google 權限 |
---|---|
讀取不含具體化檢視的 BigQuery 資料表 | 在 project 專案中:- BigQuery 讀取工作階段使用者 - BigQuery 資料檢視器 (選擇性地在資料集/資料表層級授與,而非專案層級) |
讀取具有具體化檢視的 BigQuery 資料表 | 在 project 專案中:- BigQuery 作業使用者 - BigQuery 讀取工作階段使用者 - BigQuery 資料檢視器 (選擇性地在資料集/資料表層級授與,而非專案層級) 在具體化專案中: - BigQuery 資料編輯器 |
撰寫 BigQuery 資料表 | 在 project 專案中:- BigQuery 作業使用者 - BigQuery 資料編輯器 |
如果 project
和 parentProject
不同,則需要權限
如果 project
和 parentProject
的識別碼不同,請使用下列資料表來判斷最低權限:
Azure Databricks 工作 | 需要 Google 權限 |
---|---|
讀取不含具體化檢視的 BigQuery 資料表 | 在 parentProject 專案中:- BigQuery 讀取工作階段使用者 在 project 專案中:- BigQuery 資料檢視器 (選擇性地在資料集/資料表層級授與,而非專案層級) |
讀取具有具體化檢視的 BigQuery 資料表 | 在 parentProject 專案中:- BigQuery 讀取工作階段使用者 - BigQuery 作業使用者 在 project 專案中:- BigQuery 資料檢視器 (選擇性地在資料集/資料表層級授與,而非專案層級) 在具體化專案中: - BigQuery 資料編輯器 |
撰寫 BigQuery 資料表 | 在 parentProject 專案中:- BigQuery 作業使用者 在 project 專案中:- BigQuery 資料編輯器 |
步驟 1:設定 Google Cloud
啟用 BigQuery 儲存體 API
BigQuery 儲存體 API 預設會在已啟用 BigQuery 的新 Google Cloud 專案中啟用。 不過,如果您有現有的專案且未啟用 BigQuery 儲存體 API,請遵循本節中的步驟加以啟用。
您可以使用 Google Cloud CLI 或 Google Cloud Console 來啟用 BigQuery 儲存體 API。
使用 Google Cloud CLI 啟用 BigQuery 儲存體 API
gcloud services enable bigquerystorage.googleapis.com
使用 Google Cloud Console 啟用 BigQuery 儲存體 API
在左側瀏覽窗格中,按一下 [API 與服務]。
按一下 [啟用 API 與服務] 按鈕。
在搜尋列中輸入
bigquery storage api
,然後選取第一個結果。確定已啟用 BigQuery 儲存體 API。
建立 Azure Databricks 的 Google 服務帳戶
建立 Azure Databricks 叢集的服務帳戶。 Databricks 建議您對此服務帳戶授與執行其工作所需的最低權限。 請參閱 BigQuery 角色與權限 (英文)。
您可以使用 Google Cloud CLI 或 Google Cloud Console 來建立服務帳戶。
使用 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 服務帳戶
若要建立帳戶:
在左側瀏覽窗格中,按一下 [IAM 和系統管理員]。
按一下 [服務帳戶]。
按一下 [+ 建立服務帳戶]。
輸入連結帳戶的名稱與描述。
按一下 [建立]。
指定服務帳戶的角色。 在 [選取角色] 下拉式清單中,輸入
BigQuery
並新增下列角色:按一下 [繼續]。
按一下 [完成]。
若要為您的服務帳戶建立金鑰:
請在服務帳戶清單中按一下新建立的帳戶。
在 [金鑰] 區段中選取 [新增金鑰] > [建立新金鑰] 按鈕。
接受 JSON 金鑰類型。
按一下 [建立]。 系統會將 JSON 金鑰檔案下載到您的電腦內。
重要
您為服務帳戶產生的 JSON 金鑰檔案是一種私密金鑰,因為其會控制您 Google Cloud 帳戶中資料集和資源的存取權限,所以應該只與授權使用者共用,。
建立適用於暫存儲存體的 Google Cloud Storage (GCS) 貯體
若要將資料寫入 BigQuery,資料來源會需要存取 GCS 貯體。
在左側瀏覽窗格中,按一下 [儲存體]。
按一下 [建立貯體]。
設定貯體詳細資料。
按一下 [建立]。
按一下 [權限] 索引標籤和 [新增成員]。
為貯體上的服務帳戶提供下列權限。
按一下 [儲存]。
步驟 2:設定 Azure Databricks
若要設定叢集來存取 BigQuery 資料表,您必須提供 JSON 金鑰檔案作為 Spark 組態。 使用本機工具來以 Base64 編碼為您的 JSON 金鑰檔案進行編碼。 基於安全性目的,請勿使用可存取金鑰的網頁式或遠端工具。
當您 設定叢集時:
在 [Spark 組態] 索引標籤中新增下列 Spark 組態。使用採用 Base64 編碼之 JSON 金鑰檔案的字串取代 <base64-keys>
。 使用 JSON 金鑰檔案中這些欄位的值,取代括弧 (例如 <client-email>
) 中的其他項目。
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。