其他 BigQuery 元存储空间功能

如需自定义 BigQuery 元存储区配置,您可以使用以下其他功能:

  • Apache Spark Iceberg 存储过程
  • 不受支持的表格的过滤条件选项
  • BigQuery 连接替换项

使用 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.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-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 与 BigQuery 元存储目录搭配使用时,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.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-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。

后续步骤