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
- Abilita la fatturazione per il tuo Google Cloud progetto. Scopri come verificare se la fatturazione è abilitata per un progetto.
Abilita le API BigQuery e Dataproc.
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:
-
Crea tabelle del catalogo runtime Lakehouse in Apache Spark:
- Dataproc Worker (
roles/dataproc.worker) sull'account di servizio Managed Service for Apache Spark nel progetto - Editor dati BigQuery (
roles/bigquery.dataEditor) sull'account di servizio Managed Service for Apache Spark nel progetto - Utente oggetti Storage (
roles/storage.objectUser) sull'account di servizio Managed Service for Apache Spark nel progetto
- Dataproc Worker (
-
Esegui query sulle tabelle del catalogo runtime Lakehouse in BigQuery:
- Visualizzatore dati BigQuery (
roles/bigquery.dataViewer) sul progetto - Utente BigQuery (
roles/bigquery.user) sul progetto - Visualizzatore oggetti Storage (
roles/storage.objectViewer) sul progetto
- Visualizzatore dati BigQuery (
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
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.
Crea una connessione alle risorse Cloud.
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.
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);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.
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);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'].
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.
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 URIgs://del bucket non è obbligatorio. Puoi specificare il percorso del bucket o il nome del bucket, ad esempiomybucketname1.