在 BigQuery 中搭配資料表使用 BigLake 元資料庫
本文說明如何搭配使用 BigLake 元資料庫、BigQuery 資料表和 Spark。
您可以使用 BigLake 元資料庫建立及使用標準 (內建) 資料表、BigQuery 中的 Apache Iceberg 專用 BigLake 資料表,以及 BigQuery 中的 Apache Iceberg 唯讀外部資料表。
事前準備
- 為 Google Cloud 專案啟用計費功能。瞭解如何檢查專案是否已啟用計費功能。
啟用 BigQuery 和 Dataproc API。
選用:瞭解 BigLake 元資料庫的運作方式,以及為何應使用這項服務。
必要的角色
如要取得使用 Spark 和 Dataproc 時需要的權限,並將 BigLake 中繼資料庫做為中繼資料儲存庫,請要求管理員授予您下列 IAM 角色:
-
在 Spark 中建立 BigLake 中繼資料表:
-
專案中 Dataproc Serverless 服務帳戶的 Dataproc 工作站 (
roles/dataproc.worker
) -
專案中 Dataproc Serverless 服務帳戶的 BigQuery 資料編輯者 (
roles/bigquery.dataEditor
) -
專案中 Dataproc Serverless 服務帳戶的 Storage Object Admin (
roles/storage.objectAdmin
)
-
專案中 Dataproc Serverless 服務帳戶的 Dataproc 工作站 (
-
在 BigQuery 中查詢 BigLake 元資料表:
-
專案中的 BigQuery 資料檢視者 (
roles/bigquery.dataViewer
) -
專案中的 BigQuery 使用者 (
roles/bigquery.user
) -
專案的 Storage 物件檢視器 (
roles/storage.objectViewer
)
-
專案中的 BigQuery 資料檢視者 (
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
連線至資料表
在 Google Cloud 控制台中建立資料集。
CREATE SCHEMA `PROJECT_ID`.DATASET_NAME;
更改下列內容:
PROJECT_ID
:建立資料集的 Google Cloud 專案 ID。DATASET_NAME
:資料集名稱。
建立 Cloud 資源連線。
建立標準 BigQuery 資料表。
CREATE TABLE `PROJECT_ID`.DATASET_NAME.TABLE_NAME (name STRING,id INT64);
更改下列內容:
TABLE_NAME
:資料表名稱。
將資料插入標準 BigQuery 資料表。
INSERT INTO `PROJECT_ID`.DATASET_NAME.TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
建立 BigQuery 中的 Apache Iceberg 專用 BigLake 資料表。
舉例來說,如要建立資料表,請執行下列
CREATE
陳述式。CREATE TABLE `PROJECT_ID`.DATASET_NAME.ICEBERG_TABLE_NAME( name STRING,id INT64 ) WITH CONNECTION `CONNECTION_NAME` OPTIONS ( file_format = 'PARQUET', table_format = 'ICEBERG', storage_uri = 'STORAGE_URI');
更改下列內容:
ICEBERG_TABLE_NAME
:BigQuery 中 Apache Iceberg 專用 BigLake 資料表的名稱。例如:iceberg_managed_table
。CONNECTION_NAME
:連線名稱。您在上一個步驟中已建立此項目。例如:myproject.us.myconnection
。STORAGE_URI
:完整的 Cloud Storage URI。例如:gs://mybucket/table
。
將資料插入 BigQuery 中的 Apache Iceberg 專用 BigLake 資料表。
INSERT INTO `PROJECT_ID`.DATASET_NAME.ICEBERG_TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
-
舉例來說,如要建立 Iceberg 唯讀資料表,請執行下列
CREATE
陳述式。CREATE OR REPLACE EXTERNAL TABLE `PROJECT_ID`.DATASET_NAME.READONLY_ICEBERG_TABLE_NAME WITH CONNECTION `CONNECTION_NAME` OPTIONS ( format = 'ICEBERG', uris = ['BUCKET_PATH'], require_partition_filter = FALSE);
更改下列內容:
READONLY_ICEBERG_TABLE_NAME
:唯讀資料表的名稱。BUCKET_PATH
:包含外部資料表資料的 Cloud Storage 值區路徑,格式為['gs://bucket_name/[folder_name/]file_name']
。
透過 PySpark 查詢標準資料表、BigQuery 中的 Apache Iceberg 專用 BigLake 資料表,以及 Apache Iceberg 專用唯讀外部資料表。
from pyspark.sql import SparkSession # Create a spark session spark = SparkSession.builder \ .appName("BigLake Metastore Iceberg") \ .config("spark.sql.catalog.CATALOG_NAME", "org.apache.iceberg.spark.SparkCatalog") \ .config("spark.sql.catalog.CATALOG_NAME.catalog-impl", "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog") \ .config("spark.sql.catalog.CATALOG_NAME.gcp_project", "PROJECT_ID") \ .config("spark.sql.catalog.CATALOG_NAME.gcp_location", "LOCATION") \ .config("spark.sql.catalog.CATALOG_NAME.warehouse", "WAREHOUSE_DIRECTORY") \ .getOrCreate() spark.conf.set("viewsEnabled","true") # Use the blms_catalog spark.sql("USE `CATALOG_NAME`;") spark.sql("USE NAMESPACE DATASET_NAME;") # Configure spark for temp results spark.sql("CREATE namespace if not exists MATERIALIZATION_NAMESPACE"); spark.conf.set("materializationDataset","MATERIALIZATION_NAMESPACE") # List the tables in the dataset df = spark.sql("SHOW TABLES;") df.show(); # Query the tables sql = """SELECT * FROM DATASET_NAME.TABLE_NAME""" df = spark.read.format("bigquery").load(sql) df.show() sql = """SELECT * FROM DATASET_NAME.ICEBERG_TABLE_NAME""" df = spark.read.format("bigquery").load(sql) df.show() sql = """SELECT * FROM DATASET_NAME.READONLY_ICEBERG_TABLE_NAME""" df = spark.read.format("bigquery").load(sql) df.show()
更改下列內容:
WAREHOUSE_DIRECTORY
:與 BigQuery 中的 BigLake Iceberg 資料表和 Iceberg 唯讀資料表連結的 Cloud Storage 資料夾 URI。CATALOG_NAME
:您使用的目錄名稱。MATERIALIZATION_NAMESPACE
:用於儲存臨時結果的命名空間。
使用無伺服器 Spark 執行 PySpark 指令碼。
gcloud dataproc batches submit pyspark SCRIPT_PATH \ --version=2.2 \ --project=PROJECT_ID \ --region=REGION \ --deps-bucket=YOUR_BUCKET \
更改下列內容:
SCRIPT_PATH
:批次作業使用的指令碼路徑。PROJECT_ID
:要執行批次作業的 Google Cloud 專案 ID。REGION
:工作負載執行的區域。YOUR_BUCKET
:上傳工作負載依附元件的 Cloud Storage 值區位置。不需要提供儲存桶的gs://
URI 前置字串。您可以指定值區路徑或值區名稱,例如mybucketname1
。