資料湖倉透過「BigQuery 目錄聯合」功能,提供與 BigQuery 的互通性。這項功能可讓您將 BigQuery 管理的資料表 (例如 Iceberg 管理的資料表) 暴露給外部開放原始碼 (OSS) 引擎,例如 Apache Spark 和 Trino。
Apache Iceberg REST 目錄端點純粹做為 Proxy 閘道,不必建立專屬的 Lakehouse 目錄容器來儲存中繼資料。外部引擎使用 bq:// 倉庫前置字串連線時,閘道會將目錄要求直接傳送至 BigQuery 的內部目錄。這樣一來,您就能使用標準 BigQuery DDL 或 API,直接在 BigQuery 中建立及管理資料表,同時透過 REST 目錄端點,授予外部 OSS 引擎對這些資料表的唯讀存取權。
BigQuery 目錄聯合的運作方式
透過 BigQuery 目錄聯盟,您可以透過 Lakehouse 執行階段目錄 Apache Iceberg REST 目錄端點,公開 BigQuery 資料表,例如 Iceberg 代管資料表和 BigQuery metastore 資料表。
BigQuery 目錄聯合流程如下:
- 在 BigQuery 目錄中建立資料表:您可以使用 DDL 陳述式,在 BigQuery 中建立 Iceberg 受管理資料表。這個資料表位於 BigQuery 目錄中,受 BigQuery 存取控制清單 (ACL) 管理,並做為 BigQuery REST 資源。
- 從 Lakehouse 執行階段目錄聯邦至 BigQuery 倉庫:使用 Lakehouse 執行階段目錄 Apache Iceberg REST API,聯邦至以
bq://projects/PROJECT_ID倉庫路徑格式 (或區域版本bq://projects/PROJECT_ID/locations/LOCATION) 指定的倉庫。這樣一來,您就能透過 Lakehouse API,從 Apache Spark 等運算引擎存取 BigQuery 資料表。在此設定中,您可透過 Spark 取得唯讀體驗,但可透過 BigQuery 取得讀寫體驗。
注意事項
由於 BigQuery 目錄聯盟不會建立專屬的 Lakehouse 目錄資源,因此其他目錄層級的概念和設定 (例如資源階層、儲存空間和目錄區域,以及四部分 P.C.N.T 命名結構) 不適用於這個方法。在基礎 API 中,這項設定對應於
CATALOG_TYPE_BIGQUERY設定。請注意,聯合 BigQuery 目錄不支援儲存空間存取權委派 (憑證販售)。BigQuery 目錄聯盟與無邊界 Lakehouse 的跨雲端資料存取功能不同。BigQuery 目錄聯盟會將 Google Cloud 資料表公開給外部 OSS 引擎,而 Lakehouse 則會將 Google Cloud 連線至遠端外部目錄 (例如 Databricks Unity Catalog),直接從 BigQuery 和 OSS 引擎查詢其他雲端供應商儲存的資料,不必遷移資料。如要進一步瞭解該工作流程,請參閱「關於跨雲端資料存取權」。
與 Apache Iceberg REST 目錄端點管理的資料表比較
BigQuery 目錄聯盟與 Lakehouse 執行階段目錄使用 Apache Iceberg REST 目錄端點的工作流程不同,差異如下:
- 資源管理和目錄儲存空間:同盟資料表會以 BigQuery REST 資源的形式,存放在 BigQuery 目錄中,而 Lakehouse 執行階段目錄則做為 Proxy 閘道。當 Lakehouse 執行階段目錄使用 Apache Iceberg REST 目錄端點時,資料表會直接儲存在目錄中,做為 Lakehouse REST 資源。
- 存取控管:同盟資料表會使用 BigQuery IAM 權限和存取控管清單 (ACL)。如果 Lakehouse 執行階段目錄使用 Apache Iceberg REST 目錄端點,資料表會使用 Lakehouse ACL。
- 引擎讀取和寫入功能:透過 BigQuery,同盟資料表可提供讀寫存取權,但只能從 Spark 等外部引擎讀取。當 Lakehouse 執行階段目錄使用 Apache Iceberg REST 目錄端點時,資料表會支援來自 BigQuery API 和外部引擎 (例如 Spark) 的讀寫作業。
事前準備
-
如果尚未啟用 BigLake API,請先啟用。
啟用 API 時所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。
必要的角色
如要取得在 BigQuery 中使用目錄聯盟所需的權限,請要求管理員授予您下列 IAM 角色:
- 讀取目錄資源及查詢資料表資料:
-
使用 BigQuery 目錄聯盟執行資料操縱語言 (DML) 作業:
- 專案的「BigQuery 資料編輯者」 (
roles/bigquery.dataEditor) - Cloud Storage bucket 的儲存空間管理員 (
roles/storage.admin)。如果您使用 Managed Service for Apache Spark 等查詢引擎執行 DML 作業,請將這些角色授予您在該引擎中執行工作的服務帳戶。
- 專案的「BigQuery 資料編輯者」 (
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
設定 BigQuery 目錄聯盟
如要啟用 BigQuery 目錄同盟,請在設定用戶端應用程式的用戶端設定範例中,於 WAREHOUSE_PATH 欄位設定 bq://projects/PROJECT_ID 倉庫格式,藉此設定用戶端 (例如 Apache Spark 或 Trino)。
您也可以選擇加入 BigQuery 位置,使用 bq://projects/PROJECT_ID/locations/LOCATION
格式,將日後的請求限制在單一位置。
由於這些資源是由 BigQuery 管理,您必須具備適用的必要權限。
為同盟資料表建立命名空間
為 BigQuery 目錄聯盟設定用戶端後,即可為聯盟資料表建立命名空間。
Spark
如要使用 BigQuery 目錄同盟,請加入 LOCATION 和 DBPROPERTIES 子句:
spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME LOCATION 'gs://BUCKET_NAME/NAMESPACE_NAME' WITH DBPROPERTIES ('gcp-region' = 'LOCATION');") spark.sql("USE NAMESPACE_NAME;")
更改下列內容:
NAMESPACE_NAME:命名空間名稱。BUCKET_NAME:您搭配目錄使用的 Cloud Storage bucket。LOCATION:a BigQuery 位置。預設值為US多區域。
Trino
如要使用 BigQuery 目錄同盟,請加入 LOCATION 和 gcp-region 屬性:
CREATE SCHEMA IF NOT EXISTS CATALOG_NAME.SCHEMA_NAME WITH ( LOCATION = 'gs://BUCKET_NAME/SCHEMA_NAME', "gcp-region" = 'LOCATION'); USE CATALOG_NAME.SCHEMA_NAME;
更改下列內容:
CATALOG_NAME:使用 Apache Iceberg REST 目錄端點的 Trino 目錄名稱。SCHEMA_NAME:結構定義名稱。BUCKET_NAME:您搭配目錄使用的 Cloud Storage bucket。LOCATION:a BigQuery 位置。預設值為US多區域。
在 BigQuery 中查詢聯合資料表
在聯合目錄下建立的資料表會顯示在 BigQuery 中,且可使用標準 BigQuery SQL 直接查詢 (不需要四部分 P.C.N.T 名稱):
SELECT * FROM `NAMESPACE_NAME.TABLE_NAME`;
更改下列內容:
NAMESPACE_NAME:命名空間名稱。TABLE_NAME:資料表名稱。