使用 Lakehouse 运行时目录、Spark 和 BigQuery 查询 Iceberg 表

了解如何使用 Lakehouse for Apache Iceberg,方法是使用 多存储桶目录创建 Lakehouse 运行时目录。此 配置会建立一个受管理的元数据层,用于将开源 处理引擎与 Google Cloud连接起来。

然后,您运行 Managed Service for Apache Spark PySpark 作业,以使用 Apache Iceberg REST Catalog 端点创建 Lakehouse Iceberg REST Catalog

之后,您可以使用 project.catalog.namespace.table 语法,直接从 BigQuery 中的 Google Cloud 控制台 查询结果表。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是新手 Google Cloud, 请创建一个账号来评估我们的产品在 实际场景中的表现。新客户还可获享 $300 赠金,用于 运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the BigLake, Dataproc APIs.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the BigLake, Dataproc APIs.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

授予 IAM 角色

如需允许 Managed Service for Apache Spark PySpark 作业和 Lakehouse 运行时目录使用 Cloud Storage 和 BigQuery,请向其相应的主账号授予必要的角色:

  1. 在 Google Cloud 控制台中,点击激活 Cloud Shell

    激活 Cloud Shell

  2. 点击授权

  3. 向项目的 Compute Engine 默认服务账号授予 Dataproc Worker 角色,Managed Service for Apache Spark 默认使用该服务账号 ,如 Managed Service for Apache Spark 服务账号中所述。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:$(gcloud projects describe PROJECT_ID --format='value(projectNumber)')-compute@developer.gserviceaccount.com" \
        --role="roles/dataproc.worker"
  4. 向项目的 Compute Engine 默认服务帐号授予 Service Usage Consumer 角色。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:$(gcloud projects describe PROJECT_ID --format='value(projectNumber)')-compute@developer.gserviceaccount.com" \
        --role="roles/serviceusage.serviceUsageConsumer"
  5. 向项目的 Compute Engine 默认服务帐号授予 BigLake Editor 角色。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:$(gcloud projects describe PROJECT_ID --format='value(projectNumber)')-compute@developer.gserviceaccount.com" \
        --role="roles/biglake.editor"
  6. 向项目的 Compute Engine 默认服务帐号授予 BigQuery Data Editor 角色。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:$(gcloud projects describe PROJECT_ID --format='value(projectNumber)')-compute@developer.gserviceaccount.com" \
        --role="roles/bigquery.dataEditor"

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目 ID

创建 Lakehouse 运行时目录

创建 Lakehouse 运行时目录,以管理 Iceberg 表的元数据。

  1. 在 Cloud Shell 中,运行以下命令以使用凭据销售创建多存储桶 (bl://):

    gcloud biglake iceberg catalogs create LAKEHOUSE_CATALOG_ID \
        --project=PROJECT_ID \
        --catalog-type=biglake \
        --default-location=gs://BUCKET_NAME \
        --credential-mode=vended-credentials

    替换以下内容:

    • LAKEHOUSE_CATALOG_ID:目录的唯一名称。
    • PROJECT_ID:您的 Google Cloud 项目 ID。
    • BUCKET_NAME:包含 PySpark 应用文件的 Cloud Storage 存储桶的名称。
  2. 向目录的服务帐号授予对存储桶的权限:

    1. 在 Google Cloud 控制台中,前往 Lakehouse

      前往 Lakehouse

    2. 点击您刚刚创建的目录的名称 (LAKEHOUSE_CATALOG_ID)。

    3. 身份验证方法 下,点击设置存储桶权限

    4. 在对话框中,点击确认 。这会验证目录的服务帐号是否对存储桶具有 Storage Object User 角色。

创建并运行 PySpark 作业

如需创建和查询 Iceberg 表,请先使用必要的 Spark SQL 语句创建 PySpark 作业。然后,使用 Managed Service for Apache Spark 运行该作业。

使用命名空间和表创建 PySpark 脚本

在文本编辑器中,创建一个名为 quickstart.py 的文件,其中包含以下内容。

此 PySpark 脚本会初始化 Spark 会话,以对 Iceberg 目录执行多项操作。该脚本首先会创建一个命名空间(如果尚不存在)。然后,它会创建一个名为 quickstart_table 的 Iceberg 表,其中包含基本架构。创建表后,该脚本会插入三行数据。 最后,它会查询该表以检索所有插入的记录。

然后,当您运行 gcloud dataproc batches submit pyspark 作业时,这些值将在下一步中使用。

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("quickstart").getOrCreate()

# Create a namespace (dataset) if it doesn't exist
spark.sql("CREATE NAMESPACE IF NOT EXISTS `quickstart_catalog`.quickstart_namespace")

# Create the table
spark.sql("""
    CREATE OR REPLACE TABLE `quickstart_catalog`.quickstart_namespace.quickstart_table (
        id INT,
        name STRING
    )
    USING iceberg
""")

# Insert data into the table
spark.sql("""
    INSERT INTO `quickstart_catalog`.quickstart_namespace.quickstart_table
    VALUES (1, 'one'), (2, 'two'), (3, 'three')
""")

将脚本上传到 Cloud Storage 存储桶

创建 quickstart.py 脚本后,将其上传到 Cloud Storage 存储桶。

  1. 在 Google Cloud 控制台中,前往 Cloud Storage 存储分区

    进入“存储分区”

  2. 点击存储桶的名称。

  3. 对象 标签页中,依次点击上传 > 上传文件

  4. 在文件浏览器中,选择 quickstart.py 文件,然后点击打开

运行 PySpark 作业

上传 quickstart.py 脚本后,将其作为 Managed Service for Apache Spark 批量作业运行。

  1. 在 Cloud Shell 中,使用 quickstart.py 脚本运行以下 Managed Service for Apache Spark 批量作业。

    gcloud dataproc batches submit pyspark gs://BUCKET_NAME/quickstart.py \
        --project=PROJECT_ID \
        --region=REGION \
        --version=2.2 \
        --properties="\
    spark.sql.defaultCatalog=quickstart_catalog,\
    spark.sql.catalog.quickstart_catalog=org.apache.iceberg.spark.SparkCatalog,\
    spark.sql.catalog.quickstart_catalog.type=rest,\
    spark.sql.catalog.quickstart_catalog.uri=https://biglake.googleapis.com/iceberg/v1/restcatalog,\
    spark.sql.catalog.quickstart_catalog.warehouse=bl://projects/PROJECT_ID/catalogs/LAKEHOUSE_CATALOG_ID,\
    spark.sql.catalog.quickstart_catalog.io-impl=org.apache.iceberg.gcp.gcs.GCSFileIO,\
    spark.sql.catalog.quickstart_catalog.header.x-goog-user-project=PROJECT_ID,\
    spark.sql.catalog.quickstart_catalog.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager,\
    spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,\
    spark.sql.catalog.quickstart_catalog.header.X-Iceberg-Access-Delegation=vended-credentials,\
    spark.sql.catalog.quickstart_catalog.gcs.oauth2.refresh-credentials-endpoint=https://oauth2.googleapis.com/token"

    替换以下内容:

    • BUCKET_NAME:包含 PySpark 应用文件的 Cloud Storage 存储桶的名称。

    • LAKEHOUSE_CATALOG_ID:BigLake 目录的名称。稍后,当您在 BigQuery 中使用 P.C.N.T 语法查询目录时,将使用此名称。例如,my-project.biglake-catalog.quickstart_namespace.quickstart_table

    • PROJECT_ID:您的 Google Cloud 项目 ID。

    • REGION:用于运行 Managed Service for Apache Spark 批处理工作负载的区域。

    作业完成后,系统会显示类似于以下内容的输出:

    Batch [cb9d84e9489d408baca4f9e7ab4c64ff] finished.
    metadata:
    '@type': type.googleapis.com/google.cloud.dataproc.v1.BatchOperationMetadata
    batch: projects/your-project/locations/us-central1/batches/cb9d84e9489d408baca4f9e7ab4c64ff
    batchUuid: 54b0b9d2-f0a1-4fdf-ae44-eead3f8e60e9
    createTime: '2026-01-24T00:10:50.224097Z'
    description: Batch
    labels:
        goog-dataproc-batch-id: cb9d84e9489d408baca4f9e7ab4c64ff
        goog-dataproc-batch-uuid: 54b0b9d2-f0a1-4fdf-ae44-eead3f8e60e9
        goog-dataproc-drz-resource-uuid: batch-54b0b9d2-f0a1-4fdf-ae44-eead3f8e60e9
        goog-dataproc-location: us-central1
    operationType: BATCH
    name: projects/your-project/regions/us-central1/operations/32287926-5f61-3572-b54a-fbad8940d6ef
    

从 BigQuery 查询表

  1. 在 Google Cloud 控制台中,前往 BigQuery

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句。该查询使用 project.catalog.namespace.table 语法。

    SELECT * FROM `PROJECT_ID.LAKEHOUSE_CATALOG_ID.quickstart_namespace.quickstart_table`;
    

    替换:

    • PROJECT_ID:您的 Google Cloud 项目 ID。

    • LAKEHOUSE_CATALOG_ID:要在 BigQuery 查询中使用的目录标识符。

  3. 点击运行

    查询结果会显示您使用 PySpark 作业插入的数据。

清理

为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。

  1. 更新 quickstart.py 以删除命名空间(数据集)和表:

    from pyspark.sql import SparkSession
    
    spark = SparkSession.builder.appName("quickstart").getOrCreate()
    
    # Delete the table first, then the namespace (dataset)
    spark.sql("DROP TABLE `quickstart_catalog`.quickstart_namespace.quickstart_table")
    spark.sql("DROP NAMESPACE `quickstart_catalog`.quickstart_namespace")
    

    将其上传到 Cloud Storage 存储桶:

    1. 在 Google Cloud 控制台中,前往 Cloud Storage 存储分区

      进入“存储分区”

    2. 点击存储桶的名称。

    3. 对象 标签页中,依次点击上传 > 上传文件

    4. 在文件浏览器中,选择 quickstart.py 文件,然后点击打开

    在 Cloud Shell 中,使用更新后的 quickstart.py 脚本运行另一个 Managed Service for Apache Spark 批量作业。

    gcloud dataproc batches submit pyspark gs://BUCKET_NAME/quickstart.py \
        --project=PROJECT_ID \
        --region=REGION \
        --version=2.2 \
        --properties="\
    spark.sql.defaultCatalog=quickstart_catalog,\
    spark.sql.catalog.quickstart_catalog=org.apache.iceberg.spark.SparkCatalog,\
    spark.sql.catalog.quickstart_catalog.type=rest,\
    spark.sql.catalog.quickstart_catalog.uri=https://biglake.googleapis.com/iceberg/v1/restcatalog,\
    spark.sql.catalog.quickstart_catalog.warehouse=bl://projects/PROJECT_ID/catalogs/LAKEHOUSE_CATALOG_ID,\
    spark.sql.catalog.quickstart_catalog.io-impl=org.apache.iceberg.gcp.gcs.GCSFileIO,\
    spark.sql.catalog.quickstart_catalog.header.x-goog-user-project=PROJECT_ID,\
    spark.sql.catalog.quickstart_catalog.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager,\
    spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,\
    spark.sql.catalog.quickstart_catalog.header.X-Iceberg-Access-Delegation=vended-credentials,\
    spark.sql.catalog.quickstart_catalog.gcs.oauth2.refresh-credentials-endpoint=https://oauth2.googleapis.com/token"

    替换以下内容:

    • BUCKET_NAME:包含 PySpark 应用文件的 Cloud Storage 存储桶的名称。

    • LAKEHOUSE_CATALOG_ID:BigLake 目录的名称。

    • PROJECT_ID:您的 Google Cloud 项目 ID。

    • REGION:用于运行 Managed Service for Apache Spark 批处理工作负载的区域。

  2. 前往 Lakehouse

    前往 Lakehouse

  3. 选择 LAKEHOUSE_CATALOG_ID 目录,然后点击删除

  4. 前往 Cloud Storage 存储分区

    进入“存储分区”

  5. 选择您的存储桶,然后点击删除

后续步骤