其他 BigLake Metastore 功能

如要自訂 BigLake 中繼資料庫設定,您可以使用下列額外功能:

  • Apache Spark Iceberg 程序
  • 不支援表格的篩選器選項
  • BigQuery 連線覆寫值
  • BigLake 元資料儲存庫 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 中的資料。

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

  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 值區 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:您要查詢的資料表名稱。

後續步驟