BigLake Metastore 其他功能
如要自訂 BigLake Metastore 設定,可以使用下列額外功能:
- Apache Spark Iceberg 程序
- 不支援的表格篩選器選項
- BigQuery 連線覆寫
- BigLake Metastore Iceberg 資料表的存取控管政策
使用 Iceberg Spark 程序
如要使用 Iceberg Spark 程序,請在 Spark 設定中加入 Iceberg SQL 擴充功能。舉例來說,您可以建立程序,將資料庫還原至先前的狀態。
使用互動式 Spark-SQL 回復至先前的狀態
您可以使用 Iceberg Spark 程序建立、修改資料表,以及將資料表還原至先前的狀態。例如:
建立 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] ...
再次變更表格,然後將表格還原至先前建立的快照
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 的存取權,請完成下列步驟:
在 BigQuery 專案中,建立與 Cloud Storage 資源的新連線。這個連線會定義 BigQuery 存取資料的方式。
對連線授予
roles/bigquery.connectionUser
角色,讓使用者或服務帳戶存取資料。請確認連線資源與 BigQuery 中的目標資源位於相同位置。詳情請參閱「管理連線」。
使用
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
:您要查詢的資料表名稱。