在 BigQuery 中搭配資料表使用 BigLake 元資料庫

本文說明如何搭配使用 BigLake 元資料庫、BigQuery 資料表和 Spark。

您可以使用 BigLake 元資料庫建立及使用標準 (內建) 資料表BigQuery 中的 Apache Iceberg 專用 BigLake 資料表,以及 BigQuery 中的 Apache Iceberg 唯讀外部資料表

事前準備

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

    啟用 API

  3. 選用:瞭解 BigLake 元資料庫的運作方式,以及為何應使用這項服務。

必要的角色

如要取得使用 Spark 和 Dataproc 時需要的權限,並將 BigLake 中繼資料庫做為中繼資料儲存庫,請要求管理員授予您下列 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 專用 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
  6. 將資料插入 BigQuery 中的 Apache Iceberg 專用 BigLake 資料表。

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

    舉例來說,如要建立 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']
  8. 透過 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:用於儲存臨時結果的命名空間。
  9. 使用無伺服器 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

後續步驟