BigQuery 可讓您建立及管理標準 (內建) 資料表、BigQuery 代管的 Apache Iceberg 資料表,以及外部 Apache Iceberg 資料表。接著,您可以使用 Lakehouse 執行階段目錄設定 Apache Spark 工作階段,直接從 Managed Service for Apache Spark 工作負載存取及查詢這些資料表。
事前準備
- 啟用 Google Cloud 專案的計費功能。瞭解如何確認專案是否已啟用計費功能。
啟用 BigQuery API 和 Dataproc API。
必要的角色
如要取得所需權限,將 Managed Service for Apache Spark 與 Lakehouse 執行階段目錄搭配使用,做為中繼資料儲存庫,請要求管理員授予下列 IAM 角色:
-
在 Apache Spark 中建立 Lakehouse 執行階段目錄資料表:
- 專案中 Managed Service for Apache Spark 服務帳戶的 Dataproc 工作者 (
roles/dataproc.worker) - 專案中 Managed Service for Apache Spark 服務帳戶的 BigQuery 資料編輯者 (
roles/bigquery.dataEditor) - 專案中 Managed Service for Apache Spark 服務帳戶的Storage 物件使用者 (
roles/storage.objectUser)
- 專案中 Managed Service for Apache Spark 服務帳戶的 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:Cloud Storage 資料夾的 URI,該資料夾已連結至 BigQuery 代管 Apache Iceberg 資料表和外部 Apache Iceberg 資料表。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。