Apache Spark 預存程序會在無邊界湖倉中執行工作。這些程序會連線至 Lakehouse 執行階段目錄,直接對基礎資料倉儲執行 Spark SQL 指令。
事前準備
- 啟用 Google Cloud 專案的計費功能。瞭解如何確認專案是否已啟用計費功能。
啟用 BigQuery API 和 Dataproc API。
必要的角色
如要使用 Apache Spark 預存程序,請查看預存程序的必要角色,並授予必要角色。
如要取得所需權限,以便使用 Apache Spark 和儲存程序,並將 Lakehouse 執行階段目錄做為中繼資料服務,請要求管理員授予下列 IAM 角色:
-
在 Apache Spark 中建立 Lakehouse 執行階段目錄資料表:
- 專案中 Spark 連線服務帳戶的 BigQuery 資料編輯者 (
roles/bigquery.dataEditor) 角色 - 專案中 Spark 連線服務帳戶的 Storage 物件使用者 (
roles/storage.objectUser)
- 專案中 Spark 連線服務帳戶的 BigQuery 資料編輯者 (
-
在 BigQuery 查詢 Lakehouse 執行階段目錄資料表:
- 專案的 BigQuery 資料檢視者 (
roles/bigquery.dataViewer) - 專案的 BigQuery 使用者 (
roles/bigquery.user) - 專案的 Storage 物件檢視者 (
roles/storage.objectViewer)
- 專案的 BigQuery 資料檢視者 (
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
建立及執行預存程序
以下範例說明如何使用 Lakehouse 執行階段目錄建立及執行預存程序。
前往「BigQuery」頁面
在查詢編輯器中,新增
CREATE PROCEDURE陳述式的下列程式碼範例。CREATE OR REPLACE PROCEDURE `PROJECT_ID.BQ_DATASET_ID.PROCEDURE_NAME`() WITH CONNECTION `PROJECT_ID.REGION.SPARK_CONNECTION_ID` OPTIONS (engine='SPARK', runtime_version='1.1', properties=[("spark.sql.catalog.CATALOG_NAME.warehouse", "WAREHOUSE_DIRECTORY"), ("spark.sql.catalog.CATALOG_NAME.gcp_location", "LOCATION"), ("spark.sql.catalog.CATALOG_NAME.gcp_project", "PROJECT_ID"), ("spark.sql.catalog.CATALOG_NAME", "org.apache.iceberg.spark.SparkCatalog"), ("spark.sql.catalog.CATALOG_NAME.catalog-impl", "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog"), ("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.1")], jar_uris=["gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.2.jar"]) LANGUAGE python AS R""" from pyspark.sql import SparkSession spark = SparkSession \ .builder \ .appName("Lakehouse runtime catalog Iceberg") \ .getOrCreate() spark.sql("USE CATALOG_NAME;") spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME;") spark.sql("USE NAMESPACE_NAME;") spark.sql("CREATE TABLE TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY'") spark.sql("DESCRIBE TABLE_NAME;") spark.sql("INSERT INTO TABLE_NAME VALUES (1, \"first row\");") spark.sql("SELECT * from TABLE_NAME;") spark.sql("ALTER TABLE TABLE_NAME ADD COLUMNS (newDoubleCol double);") spark.sql("DESCRIBE TABLE_NAME;") """; CALL `PROJECT_ID.BQ_DATASET_ID.PROCEDURE_NAME`();
更改下列內容:
PROJECT_ID: Google Cloud 專案的 ID。BQ_DATASET_ID:BigQuery 中包含程序的資料集 ID。PROCEDURE_NAME:要建立或取代的程序名稱。REGION:Apache Spark 連線的位置。LOCATION:BigQuery 資源的位置。SPARK_CONNECTION_ID:Apache Spark 連線的 ID。CATALOG_NAME:您使用的目錄名稱。WAREHOUSE_DIRECTORY:Cloud Storage 資料夾的 URI,其中包含資料倉儲。NAMESPACE_NAME:您使用的命名空間。