Utilizza il catalogo del runtime Lakehouse con le tabelle in BigQuery

Questo documento fornisce un esempio di come utilizzare il catalogo runtime Lakehouse con le tabelle BigQuery e Managed Service for Apache Spark.

Con il catalogo runtime Lakehouse, puoi creare e utilizzare tabelle standard (integrate), tabelle Apache Iceberg gestite da BigQuery, e tabelle Apache Iceberg esterne da BigQuery.

Formati di tabella supportati

Sono supportate solo le tabelle Apache Iceberg V2; le tabelle Iceberg V1 non sono supportate. Se hai tabelle Iceberg V1 esistenti, devi eseguirne l'upgrade alla versione 2 (ad esempio, eseguendo ALTER TABLE catalog.schema.table SET TBLPROPERTIES ('format-version'='2'); o utilizzando operazioni del motore simili) prima di utilizzarle con il catalogo runtime Lakehouse.

Prima di iniziare

  1. Abilita la fatturazione per il tuo Google Cloud progetto. Scopri come verificare se la fatturazione è abilitata per un progetto.
  2. Abilita le API BigQuery e Dataproc.

    Abilita le API

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per utilizzare Managed Service for Apache Spark con il catalogo runtime Lakehouse come archivio di metadati, chiedi all'amministratore di concederti i seguenti ruoli IAM:

Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Connettersi a una tabella

  1. Crea un set di dati nellaconsole Google Cloud .

    CREATE SCHEMA `PROJECT_ID`.DATASET_NAME;

    Sostituisci quanto segue:

    • PROJECT_ID: l'ID del Google Cloud progetto in cui creare il set di dati.
    • DATASET_NAME: un nome per il set di dati.
  2. Crea una connessione alle risorse Cloud.

  3. Crea una tabella BigQuery standard.

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

    Sostituisci quanto segue:

    • TABLE_NAME: un nome per la tabella.
  4. Inserisci i dati nella tabella BigQuery standard.

    INSERT INTO `PROJECT_ID`.DATASET_NAME.TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
  5. Crea una tabella Apache Iceberg gestita da BigQuery.

    Ad esempio, per creare una tabella, esegui la seguente istruzione CREATE.

    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');

    Sostituisci quanto segue:

    • ICEBERG_TABLE_NAME: un nome per la tabella Apache Iceberg gestita. Ad esempio, iceberg_managed_table.
    • CONNECTION_NAME: il nome della connessione. L'hai creata nel passaggio precedente. Ad esempio, myproject.us.myconnection.
    • STORAGE_URI: un URI Cloud Storage completo. Ad esempio, gs://mybucket/table.
  6. Inserisci i dati nella tabella Apache Iceberg gestita da BigQuery.

    INSERT INTO `PROJECT_ID`.DATASET_NAME.ICEBERG_TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
  7. Crea una tabella Apache Iceberg esterna.

    Ad esempio, per creare una tabella Apache Iceberg esterna, esegui la seguente istruzione CREATE.

    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);

    Sostituisci quanto segue:

    • READONLY_ICEBERG_TABLE_NAME: un nome per la tabella di sola lettura.
    • BUCKET_PATH: il percorso del bucket Cloud Storage che contiene i dati per la tabella esterna, nel formato ['gs://bucket_name/[folder_name/]file_name'].
  8. Da Apache Spark, esegui query sulla tabella standard, sulla tabella Apache Iceberg gestita da BigQuery e sulla tabella Apache Iceberg esterna.

    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()

    Sostituisci quanto segue:

    • WAREHOUSE_DIRECTORY: l'URI della cartella Cloud Storage collegata alla tabella Apache Iceberg gestita da BigQuery e alla tabella Apache Iceberg esterna.
    • CATALOG_NAME: il nome del catalogo che stai utilizzando.
    • MATERIALIZATION_NAMESPACE: lo spazio dei nomi per l'archiviazione dei risultati temporanei.
  9. Esegui lo script Apache Spark utilizzando Managed Service for Apache Spark.

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

    Sostituisci quanto segue:

    • SCRIPT_PATH: il percorso dello script utilizzato dal job batch.
    • PROJECT_ID: l'ID del Google Cloud progetto in cui eseguire il job batch.
    • REGION: la regione in cui viene eseguito il carico di lavoro.
    • YOUR_BUCKET: la località del bucket Cloud Storage in cui caricare le dipendenze del carico di lavoro. Il prefisso URI gs:// del bucket non è obbligatorio. Puoi specificare il percorso del bucket o il nome del bucket, ad esempio mybucketname1.

Passaggi successivi