BigLake Metastore 其他功能

如要自訂 BigLake Metastore 設定,可以使用下列額外功能:

  • Apache Spark Iceberg 程序
  • 不支援的表格篩選器選項
  • BigQuery 連線覆寫
  • BigLake Metastore Iceberg 資料表的存取控管政策

使用 Iceberg Spark 程序

如要使用 Iceberg Spark 程序,請在 Spark 設定中加入 Iceberg SQL 擴充功能。舉例來說,您可以建立程序,將資料庫還原至先前的狀態。

使用互動式 Spark-SQL 回復至先前的狀態

您可以使用 Iceberg Spark 程序建立、修改資料表,以及將資料表還原至先前的狀態。例如:

  1. 建立 Spark 資料表:

    spark-sql \
       --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.1-beta.jar \
       --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
       --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
       --conf spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog \
       --conf spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID \
       --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY

    更改下列內容:

    • CATALOG_NAME:參照 Spark 資料表的目錄名稱。
    • PROJECT_ID: Google Cloud 專案的 ID。

    • WAREHOUSE_DIRECTORY:儲存資料倉儲的 Cloud Storage 資料夾 URI。

    USE `CATALOG_NAME`;
    CREATE NAMESPACE NAMESPACE_NAME;
    USE NAMESPACE NAMESPACE_NAME;
    CREATE TABLE NAMESPACE_NAME.TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY';
    INSERT INTO NAMESPACE_NAME.TABLE_NAME VALUES (1, "first row");
    DESCRIBE EXTENDED TABLE_NAME;

    更改下列內容:

    • NAMESPACE_NAME:參照 Spark 資料表的命名空間名稱。
    • TABLE_NAME:參照 Spark 資料表的資料表名稱。

    輸出內容包含資料表設定的詳細資料:

    ...
    Table Properties [current-snapshot-id=1659239298328512231,format=iceberg/parquet,format-version=2,write.parquet.compression-codec=zstd]
    ...
  2. 再次變更表格,然後將表格還原至先前建立的快照 1659239298328512231

    ALTER TABLE TABLE_NAME ADD COLUMNS (newDoubleCol double);
    INSERT INTO TABLE_NAME VALUES (2, "second row", 2.5);
    SELECT * FROM TABLE_NAME;
    CALL CATALOG_NAME.system.set_current_snapshot('NAMESPACE_NAME.TABLE_NAME', SNAPSHOT_ID);
    SELECT * FROM TABLE_NAME;

    更改下列內容:

    • SNAPSHOT_ID:要還原的快照 ID。

    輸出結果會與下列內容相似:

    1 first row
    Time taken: 0.997 seconds, Fetched 1 row(s)

從資料表列出函式中篩除不支援的資料表

使用 Spark SQL 和 BigLake 中繼存放區目錄時,SHOW TABLES 指令會顯示指定命名空間中的所有資料表,即使這些資料表與 Spark 不相容也一樣。

如要只顯示支援的表格,請開啟filter_unsupported_tables選項:

spark-sql
  --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.1-beta.jar \
  --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog \
  --conf spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID \
  --conf spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION \
  --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY \
  --conf spark.sql.catalog.CATALOG_NAME.filter_unsupported_tables="true"

更改下列內容:

  • CATALOG_NAME:要使用的 Spark 目錄名稱。
  • PROJECT_ID:要使用的 Google Cloud 專案 ID。
  • LOCATION:BigQuery 資源的位置。
  • WAREHOUSE_DIRECTORY:用來做為資料倉儲的 Cloud Storage 資料夾。

設定 BigQuery 連線覆寫

您可以使用 BigQuery 連線存取儲存在 BigQuery 外部的資料,例如 Cloud Storage 中的資料。

如要設定 BigQuery 連線覆寫,以提供 Cloud Storage bucket 的存取權,請完成下列步驟:

  1. 在 BigQuery 專案中,建立與 Cloud Storage 資源的新連線。這個連線會定義 BigQuery 存取資料的方式。

  2. 對連線授予 roles/bigquery.connectionUser 角色,讓使用者或服務帳戶存取資料。

    請確認連線資源與 BigQuery 中的目標資源位於相同位置。詳情請參閱「管理連線」。

  3. 使用 bq_connection 屬性在 Iceberg 資料表中指定連線:

    CREATE TABLE TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY' TBLPROPERTIES ('bq_connection'='projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID');

    更改下列內容:

    • TABLE_NAME:Spark 資料表的資料表名稱。
    • WAREHOUSE_DIRECTORY:儲存資料的 Cloud Storage bucket URI。
    • PROJECT_ID:要使用的 Google Cloud 專案 ID。
    • LOCATION:連線的位置
    • CONNECTION_ID:連線的 ID。

設定存取控管政策

您可以設定存取控管政策,在 BigLake 中繼存放區 Iceberg 資料表上啟用精細的存取控管機制 (FGAC)。您只能在採用 BigQuery 連線覆寫的資料表上設定存取控管政策。您可以透過下列方式設定這些政策:

設定 FGAC 政策後,您可以使用下列範例,從 Spark 查詢資料表:

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.sql("USE `CATALOG_NAME`;")

# Configure spark for storing temp results
spark.conf.set("viewsEnabled","true")
spark.sql("CREATE namespace if not exists MATERIALIZATION_NAMESPACE");
spark.conf.set("materializationDataset","MATERIALIZATION_NAMESPACE")

spark.sql("USE NAMESPACE DATASET_NAME;")

sql = """SELECT * FROM DATASET_NAME.ICEBERG_TABLE_NAME"""
df = spark.read.format("bigquery").load(sql)
df.show()

更改下列內容:

  • CATALOG_NAME:目錄名稱。
  • PROJECT_ID:包含 BigQuery 資源的專案 ID。
  • LOCATION:BigQuery 資源的位置
  • WAREHOUSE_DIRECTORY:包含資料倉儲的 Cloud Storage 資料夾 URI。
  • MATERIALIZATION_NAMESPACE:您要儲存暫時結果的命名空間。
  • DATASET_NAME:包含您要查詢的資料表的資料集名稱。
  • ICEBERG_TABLE_NAME:您要查詢的資料表名稱。

後續步驟