Lakehouse-Laufzeitkatalog mit Tabellen in BigQuery verwenden

In diesem Dokument finden Sie ein Beispiel für die Verwendung des Lakehouse-Laufzeitkatalogs mit BigQuery-Tabellen und Managed Service for Apache Spark.

Mit dem Lakehouse-Laufzeitkatalog können Sie standardmäßige (integrierte) Tabellen, von BigQuery verwaltete Apache Iceberg-Tabellen und externe Apache Iceberg-Tabellen in BigQuery erstellen und verwenden.

Unterstützte Tabellenformate

Es werden nur Apache Iceberg V2-Tabellen unterstützt. Iceberg V1-Tabellen werden nicht unterstützt. Wenn Sie bereits Iceberg V1-Tabellen haben, müssen Sie sie auf V2 aktualisieren, z. B. durch Ausführen von ALTER TABLE catalog.schema.table SET TBLPROPERTIES ('format-version'='2'); oder ähnlichen Engine-Vorgängen, bevor Sie sie mit dem Lakehouse-Laufzeitkatalog verwenden können.

Hinweis

  1. Aktivieren Sie die Abrechnung für Ihr Google Cloud Projekt. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist.
  2. Aktivieren Sie die BigQuery und Dataproc APIs.

    APIs aktivieren

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie für die Verwendung von Managed Service for Apache Spark mit dem Lakehouse-Laufzeitkatalog als Metadatenspeicher benötigen:

  • Lakehouse-Laufzeitkatalogtabellen in Apache Spark erstellen:
    • Dataproc-Worker (roles/dataproc.worker) für das Dienstkonto des Managed Service for Apache Spark im Projekt
    • BigQuery-Datenbearbeiter (roles/bigquery.dataEditor) für das Dienstkonto des Managed Service for Apache Spark im Projekt
    • Storage-Objekt-Nutzer (roles/storage.objectUser) für das Managed Service for Apache Spark-Dienstkonto im Projekt
  • Lakehouse-Laufzeitkatalogtabellen in BigQuery abfragen:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Verbindung zu einer Tabelle herstellen

  1. Erstellen Sie ein Dataset in der Google Cloud -Console.

    CREATE SCHEMA `PROJECT_ID`.DATASET_NAME;

    Ersetzen Sie Folgendes:

    • PROJECT_ID: die ID des Google Cloud Projekts, in dem das Dataset erstellt werden soll.
    • DATASET_NAME: Ein Name für Ihr Dataset.
  2. Cloud-Ressourcenverbindung erstellen

  3. Erstellen Sie eine BigQuery-Standardtabelle.

    CREATE TABLE `PROJECT_ID`.DATASET_NAME.TABLE_NAME (name STRING,id INT64);

    Ersetzen Sie Folgendes:

    • TABLE_NAME: Ein Name für Ihre Tabelle.
  4. Fügen Sie Daten in die Standard-BigQuery-Tabelle ein.

    INSERT INTO `PROJECT_ID`.DATASET_NAME.TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
  5. Erstellen Sie eine von BigQuery verwaltete Apache Iceberg-Tabelle.

    Wenn Sie beispielsweise eine Tabelle erstellen möchten, führen Sie die folgende CREATE-Anweisung aus.

    CREATE TABLE `PROJECT_ID`.DATASET_NAME.ICEBERG_TABLE_NAME(
    name STRING,id INT64
    )
    WITH CONNECTION `CONNECTION_NAME`
    OPTIONS (
    file_format = 'PARQUET',
    table_format = 'ICEBERG',
    storage_uri = 'STORAGE_URI');

    Ersetzen Sie Folgendes:

    • ICEBERG_TABLE_NAME: Ein Name für Ihre verwaltete Apache Iceberg-Tabelle. Beispiel: iceberg_managed_table.
    • CONNECTION_NAME: der Name Ihrer Verbindung. Sie haben sie im vorherigen Schritt erstellt. Beispiel: myproject.us.myconnection.
    • STORAGE_URI: ein voll qualifizierter Cloud Storage-URI. Beispiel: gs://mybucket/table.
  6. Fügen Sie Daten in die von BigQuery verwaltete Apache Iceberg-Tabelle ein.

    INSERT INTO `PROJECT_ID`.DATASET_NAME.ICEBERG_TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
  7. Erstellen Sie eine externe Apache Iceberg-Tabelle.

    Wenn Sie beispielsweise eine externe Apache Iceberg-Tabelle erstellen möchten, führen Sie die folgende CREATE-Anweisung aus.

    CREATE OR REPLACE EXTERNAL TABLE  `PROJECT_ID`.DATASET_NAME.READONLY_ICEBERG_TABLE_NAME
    WITH CONNECTION `CONNECTION_NAME`
    OPTIONS (
      format = 'ICEBERG',
      uris =
        ['BUCKET_PATH'],
      require_partition_filter = FALSE);

    Ersetzen Sie Folgendes:

    • READONLY_ICEBERG_TABLE_NAME: Ein Name für Ihre schreibgeschützte Tabelle.
    • BUCKET_PATH: der Pfad zum Cloud Storage-Bucket, der die Daten für die externe Tabelle im Format ['gs://bucket_name/[folder_name/]file_name'] enthält.
  8. Fragen Sie die Standardtabelle, die von BigQuery verwaltete Apache Iceberg-Tabelle und die externe Apache Iceberg-Tabelle über Apache Spark ab.

    from pyspark.sql import SparkSession
    
    # Create a spark session
    spark = SparkSession.builder \
    .appName("Lakehouse runtime catalog 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.conf.set("viewsEnabled","true")
    
    # Use the Lakehouse runtime catalog
    spark.sql("USE `CATALOG_NAME`;")
    spark.sql("USE NAMESPACE DATASET_NAME;")
    
    # Configure spark for temp results
    spark.sql("CREATE namespace if not exists MATERIALIZATION_NAMESPACE");
    spark.conf.set("materializationDataset","MATERIALIZATION_NAMESPACE")
    
    # List the tables in the dataset
    df = spark.sql("SHOW TABLES;")
    df.show();
    
    # Query the tables
    sql = """SELECT * FROM DATASET_NAME.TABLE_NAME"""
    df = spark.read.format("bigquery").load(sql)
    df.show()
    
    sql = """SELECT * FROM DATASET_NAME.ICEBERG_TABLE_NAME"""
    df = spark.read.format("bigquery").load(sql)
    df.show()
    
    sql = """SELECT * FROM DATASET_NAME.READONLY_ICEBERG_TABLE_NAME"""
    df = spark.read.format("bigquery").load(sql)
    df.show()

    Ersetzen Sie Folgendes:

    • WAREHOUSE_DIRECTORY: Der URI des Cloud Storage-Ordners, der mit Ihrer verwalteten Apache Iceberg-Tabelle von BigQuery und Ihrer externen Apache Iceberg-Tabelle verbunden ist.
    • CATALOG_NAME: der Name des Katalogs, den Sie verwenden.
    • MATERIALIZATION_NAMESPACE: Der Namespace zum Speichern temporärer Ergebnisse.
  9. Führen Sie das Apache Spark-Skript mit Managed Service for Apache Spark aus.

    gcloud dataproc batches submit pyspark SCRIPT_PATH \
      --version=2.2 \
      --project=PROJECT_ID \
      --region=REGION \
      --deps-bucket=YOUR_BUCKET \

    Ersetzen Sie Folgendes:

    • SCRIPT_PATH: Der Pfad zum Skript, das vom Batchjob verwendet wird.
    • PROJECT_ID: Die ID des Google Cloud Projekts, in dem der Batchjob ausgeführt werden soll.
    • REGION: die Region, in der Ihre Arbeitslast ausgeführt wird.
    • YOUR_BUCKET: Der Speicherort des Cloud Storage-Bucket zum Hochladen von Arbeitslastabhängigkeiten. Das gs://-URI-Präfix des Buckets ist nicht erforderlich. Sie können den Bucket-Pfad oder den Bucket-Namen angeben, z. B. mybucketname1.

Nächste Schritte