搭配使用 Lakehouse 執行階段目錄與 BigQuery 中的資料表

BigQuery 可讓您建立及管理標準 (內建) 資料表、BigQuery 代管的 Apache Iceberg 資料表,以及外部 Apache Iceberg 資料表。接著,您可以使用 Lakehouse 執行階段目錄設定 Apache Spark 工作階段,直接從 Managed Service for Apache Spark 工作負載存取及查詢這些資料表。

事前準備

  1. 啟用 Google Cloud 專案的計費功能。瞭解如何確認專案是否已啟用計費功能。
  2. 啟用 BigQuery API 和 Dataproc API。

    啟用 API

必要的角色

如要取得所需權限,將 Managed Service for Apache Spark 與 Lakehouse 執行階段目錄搭配使用,做為中繼資料儲存庫,請要求管理員授予下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

連線至資料表

  1. 在 Google Cloud 控制台中建立資料集。

    CREATE SCHEMA `PROJECT_ID`.DATASET_NAME;

    更改下列內容:

    • PROJECT_ID:要建立資料集的 Google Cloud 專案 ID。
    • DATASET_NAME:資料集的名稱。
  2. 建立 Cloud 資源連結。

  3. 建立標準 BigQuery 資料表。

    CREATE TABLE `PROJECT_ID`.DATASET_NAME.TABLE_NAME (name STRING,id INT64);

    更改下列內容:

    • TABLE_NAME:資料表名稱。
  4. 將資料插入標準 BigQuery 資料表。

    INSERT INTO `PROJECT_ID`.DATASET_NAME.TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
  5. 建立 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。
  6. 將資料插入 BigQuery 代管的 Apache Iceberg 資料表。

    INSERT INTO `PROJECT_ID`.DATASET_NAME.ICEBERG_TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
  7. 建立外部 Apache Iceberg 資料表。

    例如,如要建立外部 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']。
  8. 從 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:用於儲存暫時結果的命名空間。
  9. 使用 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。

後續步驟