搭配使用 BigLake metastore 和 Iceberg REST 目錄

BigLake metastore 中的受管理 Apache Iceberg REST 目錄,可為所有 Iceberg 資料提供單一事實來源,在所有查詢引擎之間建立互通性。查詢引擎 (例如 Apache Spark) 可透過這個目錄,以一致的方式探索、讀取中繼資料,以及管理 Iceberg 資料表。

搭配 Iceberg REST 目錄使用的 Iceberg 資料表稱為 Apache Iceberg 專用 BigLake 資料表 (預先發布版)。這些是您從開放原始碼引擎建立,並儲存在 Cloud Storage 中的 Iceberg 資料表。開放原始碼引擎或 BigQuery 都可以讀取這些資料表。只有開放原始碼引擎支援寫入作業。本文將這些資料表稱為 BigLake Iceberg 資料表。

事前準備

  1. Make sure that billing is enabled for your Google Cloud project.

    瞭解如何檢查專案是否已啟用計費功能
  2. Enable the BigLake API.

    Enable the API

  3. 選用:瞭解 BigLake Metastore 的運作方式,以及使用這項服務的原因。

必要的角色

如要取得在 BigLake Metastore 中使用 Iceberg REST 目錄所需的權限,請要求管理員在專案或服務帳戶中授予下列 IAM 角色:

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

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

限制

Iceberg REST 目錄有下列限制:

使用 Iceberg REST 目錄設定查詢引擎

import google.auth
from google.auth.transport.requests import Request
from google.oauth2 import service_account
import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession

catalog_name = "CATALOG_NAME"
spark = SparkSession.builder.appName("APP_NAME") \
    .config("spark.sql.defaultCatalog", catalog_name) \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.type", "rest") \
    .config(f"spark.sql.catalog.{catalog_name}.uri","https://biglake.googleapis.com/iceberg/v1beta/restcatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.warehouse", "gs://STORAGE_URI") \
    .config(f"spark.sql.catalog.{catalog_name}.token", "TOKEN") \
    .config(f"spark.sql.catalog.{catalog_name}.oauth2-server-uri", "https://oauth2.googleapis.com/token") \
    .config(f"spark.sql.catalog.{catalog_name}.header.x-goog-user-project", "PROJECT_ID") \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .config(f"spark.sql.catalog.{catalog_name}.io-impl","org.apache.iceberg.hadoop.HadoopFileIO") \
    .config(f"spark.sql.catalog.{catalog_name}.rest-metrics-reporting-enabled", "false") \
    .getOrCreate()

更改下列內容:

  • CATALOG_NAME:Iceberg REST 目錄的名稱。
  • APP_NAME:Spark 工作階段的名稱。
  • STORAGE_URI:包含 BigLake Iceberg 資料表的 Cloud Storage 值區 URI。
  • TOKEN:您的驗證權杖,有效時間為一小時,例如 gcloud auth application-default print-access-token
  • PROJECT_ID:使用 Iceberg REST 目錄時,系統會向這個專案收取費用,這可能與擁有 Cloud Storage 值區的專案不同。如要瞭解使用 REST API 時的專案設定詳情,請參閱系統參數

建立命名空間

spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME;")

spark.sql("USE NAMESPACE_NAME;")

NAMESPACE_NAME 替換為命名空間的名稱。

建立資料表

spark.sql("CREATE TABLE TABLE_NAME (id int, data string) USING ICEBERG;")

spark.sql("DESCRIBE NAMESPACE_NAME.TABLE_NAME").show()

更改下列內容:

  • NAMESPACE_NAME:命名空間名稱
  • TABLE_NAME:資料表名稱

列出表格

spark.sql("SHOW TABLES").show()

將資料插入資料表

以下範例會在資料表中插入範例資料:

spark.sql("INSERT INTO TABLE_NAME VALUES (1, \"first row\"), (2, \"second row\"), (3, \"third row\");")

查詢資料表

以下範例會選取資料表中的所有資料:

spark.sql("SELECT * FROM TABLE_NAME;").show()

變更資料表結構定義

以下範例會在資料表中新增資料欄:

spark.sql("ALTER TABLE TABLE_NAME ADD COLUMNS ( desc string);")
spark.sql("DESCRIBE NAMESPACE_NAME.TABLE_NAME").show()

刪除資料表

以下範例會從指定命名空間刪除資料表:

spark.sql("DROP TABLE TABLE_NAME;")

定價

如需定價詳情,請參閱 BigLake 定價

後續步驟