本文提供範例,說明如何搭配使用 Lakehouse 執行階段目錄、BigQuery 資料表和 Managed Service for Apache Spark。
透過 Lakehouse 執行階段目錄,您可以從 BigQuery 建立及使用標準 (內建) 資料表、BigQuery 代管的 Apache Iceberg 資料表和外部 Apache Iceberg 資料表。
事前準備
- 為 Google Cloud 專案啟用計費功能。瞭解如何檢查專案是否已啟用計費功能。
啟用 BigQuery 和 Dataproc API。
必要的角色
如要取得使用 Managed Service for Apache Spark 時,將 Lakehouse 執行階段目錄做為中繼資料儲存庫所需的權限,請要求管理員授予下列 IAM 角色:
-
在 Apache Spark 中建立 Lakehouse 執行階段目錄資料表:
- Dataproc 工作者 (
roles/dataproc.worker) 專案中 Managed Service for Apache Spark 服務帳戶的 - 專案中 Managed Service for Apache Spark 服務帳戶的 BigQuery 資料編輯者 (
roles/bigquery.dataEditor) - 專案中 Managed Service for Apache Spark 服務帳戶的「Storage 物件使用者」 (
roles/storage.objectUser) 角色
- Dataproc 工作者 (
-
在 BigQuery 中查詢 Lakehouse 執行階段目錄資料表:
- 專案的 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 資料表。
舉例來說,如要建立資料表,請執行下列
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:受管理 Apache Iceberg 資料表的名稱。例如:iceberg_managed_table。CONNECTION_NAME:連線名稱。您在上一個步驟中建立了這個檔案。例如:myproject.us.myconnection。STORAGE_URI:完整 Cloud Storage URI。例如:gs://mybucket/table。
將資料插入 BigQuery 代管的 Apache Iceberg 資料表。
INSERT INTO `
PROJECT_ID`.DATASET_NAME.ICEBERG_TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);-
舉例來說,如要建立外部 Apache 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 bucket 的路徑,其中包含外部資料表的資料,格式為['gs://bucket_name/[folder_name/]file_name']。
從 Apache Spark 查詢標準資料表、BigQuery 管理的 Apache Iceberg 資料表,以及外部 Apache Iceberg 資料表。
from pyspark.sql import SparkSession # Create a spark session spark = SparkSession.builder \ .appName("Lakehouse runtime catalog 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 Lakehouse runtime 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 管理的 Apache Iceberg 資料表和外部 Apache Iceberg 資料表連線的 Cloud Storage 資料夾 URI。CATALOG_NAME:您使用的目錄名稱。MATERIALIZATION_NAMESPACE:用於儲存暫時結果的命名空間。
使用 Managed Service for Apache Spark 執行 Apache Spark 指令碼。
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 bucket 位置。不需要提供 bucket 的gs://URI 前置字串。您可以指定 bucket 路徑或 bucket 名稱,例如mybucketname1。