Tabelle BigQuery per Apache Iceberg

Per ricevere assistenza durante la versione di anteprima, invia un'email all'indirizzo bigquery-tables-for-apache-iceberg-help@google.com.

Le tabelle BigQuery per Apache Iceberg (di seguito tabelle Iceberg) forniscono la base per creare lakehouse in formato aperto su Google Cloud. Le tabelle Iceberg offrono la stessa esperienza completamente gestita delle tabelle BigQuery, ma archiviano i dati in bucket di archiviazione di proprietà del cliente utilizzando Parquet per essere interoperabili con i formati delle tabelle aperte Iceberg.

Le tabelle BigQuery per Apache Iceberg sono diverse dalle tabelle esterne BigLake per Apache Iceberg perché solo le tabelle BigQuery per Apache Iceberg sono modificabili direttamente in BigQuery. Le tabelle esterne BigLake per Apache Iceberg sono tabelle di sola lettura generate da un altro motore di query, ad esempio Apache Spark, e possono essere sottoposte a query solo utilizzando BigQuery.

Le tabelle iceberg supportano le seguenti funzionalità:

Architettura

Le tabelle Iceberg offrono la praticità della gestione delle risorse BigQuery alle tabelle che si trovano nei tuoi bucket cloud. Le tabelle iceberg ti consentono di utilizzare BigQuery su queste tabelle senza spostare i dati dai bucket che controlli.

Il seguente diagramma mostra l'architettura delle tabelle gestite a un livello generale: Diagramma dell'architettura delle tabelle BigQuery per Iceberg.

Questa gestione delle tabelle ha le seguenti implicazioni sul bucket:

  • BigQuery crea nuovi file di dati nel bucket in risposta alle richieste di scrittura e alle ottimizzazioni dello spazio di archiviazione in background, ad esempio gli statement DML e lo streaming.
  • Quando elimini una tabella gestita in BigQuery, BigQuery non elimina i file di dati associati. Devi confermare l'eliminazione eliminando manualmente i file e gli eventuali metadati delle tabelle esportati dal bucket.
  • Le tabelle iceberg non comportano costi di archiviazione di BigQuery. Per ulteriori informazioni, consulta Fatturazione.

La creazione di una tabella Iceberg è simile alla creazione di tabelle BigQuery. Poiché archivia i dati in formati aperti su Cloud Storage, offre più opzioni per quanto riguarda:

  • Specifica la connessione alla risorsa cloud con WITH CONNECTION per configurare le credenziali di connessione per consentire a BigLake di accedere a Cloud Storage.
  • Specifica il formato del file di archiviazione dei dati con file_format. PARQUET è supportato in Anteprima.
  • Specifica il formato della tabella dei metadati open source con table_format. ICEBERG è supportato in Anteprima.

Best practice

La modifica o l'aggiunta diretta di file al bucket al di fuori di BigQuery può comportare la perdita di dati o errori non recuperabili. La seguente tabella descrive i possibili scenari:

Operazione Conseguenze Prevenzione
Aggiungi nuovi file al bucket al di fuori di BigQuery. Perdita di dati: i nuovi file o oggetti aggiunti al di fuori di BigQuery non vengono monitorati da BigQuery. I file non monitorati vengono eliminati dai processi di garbage collection in background. Aggiungi dati esclusivamente tramite BigQuery. In questo modo, BigQuery può monitorare i file ed evitare che vengano sottoposti a raccolta del garbage.
Per evitare aggiunte accidentali e perdita di dati, ti consigliamo inoltre di limitare le autorizzazioni di scrittura degli strumenti esterni ai bucket contenenti le tabelle Iceberg.
Crea una nuova tabella Iceberg in un prefisso non vuoto. Perdita di dati: i dati esistenti non vengono monitorati da BigQuery, pertanto questi file sono considerati non monitorati e vengono eliminati dalle procedure di garbage collection in background. Crea nuove tabelle Iceberg solo in prefissi vuoti.
Modificare o sostituire i file di dati delle tabelle Iceberg. Perdita di dati:in caso di modifica o sostituzione esterna, la tabella non supera un controllo di coerenza e diventa illeggibile. Le query sulla tabella non vanno a buon fine.
Non è possibile eseguire il recupero self-service da questo punto. Contatta l'assistenza per ricevere assistenza per il recupero dei dati.
Modificare i dati esclusivamente tramite BigQuery. In questo modo, BigQuery può monitorare i file ed evitare che vengano sottoposti a raccolta del garbage.
Per evitare aggiunte accidentali e perdita di dati, ti consigliamo inoltre di limitare le autorizzazioni di scrittura degli strumenti esterni ai bucket contenenti le tabelle Iceberg.
Crea due tabelle BigQuery per Apache Iceberg negli stessi URI o in URI sovrapposti. Perdita di dati: BigQuery non esegue il bridging di istanze URI identiche delle tabelle Iceberg. I processi di garbage collection in background per ogni tabella considereranno i file della tabella opposta come non monitorati ed li elimineranno, causando la perdita di dati. Utilizza URI univoci per ogni tabella Iceberg.

Fatturazione

Per le seguenti funzionalità viene addebitato l'importo in base ai prezzi pubblicati esistenti:

  • Prezzi di Cloud Storage per tutti i dati archiviati nei bucket Cloud Storage, l'elaborazione dei dati eseguita da Cloud Storage e l'utilizzo della rete per la quantità di dati letti dal tuo bucket.
  • Prezzi di BigQuery Compute per query, DML e ottimizzazione dello spazio di archiviazione in background (incluso il clustering, la coalescenza e garbage collection).
    • Gli addebiti relativi all'utilizzo delle prenotazioni (slot) seguono i prezzi esistenti degli slot.
    • Gli addebiti che utilizzano gli SKU (codice identificativo dell'articolo) on demand rispettano i prezzi on demand esistenti. Per ulteriori informazioni, consulta Costi di BigLake.
  • I costi di calcolo per caricamenti batch e estrazione vengono addebitati utilizzando SKU on demand o prenotazioni (slot).
  • Prezzi dell'API Storage di lettura per la lettura da Spark tramite l'API Read.
  • Prezzi dell'API Storage Write per lo streaming.

Flussi di lavoro delle tabelle Iceberg

Le sezioni seguenti descrivono come creare, caricare, gestire e eseguire query sulle tabelle gestite.

Prima di iniziare

Prima di creare e utilizzare le tabelle Iceberg, assicurati di aver configurato una connessione a una risorsa cloud a un bucket di archiviazione. La connessione richiede autorizzazioni di scrittura sul bucket di archiviazione, come specificato nella sezione Ruoli richiesti di seguito.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per consentire a BigQuery di gestire le tabelle nel tuo progetto, chiedi all'amministratore di concederti i seguenti ruoli IAM:

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

Questi ruoli predefiniti contengono le autorizzazioni necessarie per consentire a BigQuery di gestire le tabelle nel tuo progetto. Per visualizzare le autorizzazioni esatte richieste, espandi la sezione Autorizzazioni richieste:

Autorizzazioni obbligatorie

Per consentire a BigQuery di gestire le tabelle nel tuo progetto, sono necessarie le seguenti autorizzazioni:

  • bigquery.connections.delegate nel tuo progetto
  • bigquery.jobs.create nel tuo progetto
  • bigquery.readsessions.create nel tuo progetto
  • bigquery.tables.create nel tuo progetto
  • bigquery.tables.get nel tuo progetto
  • bigquery.tables.getData nel tuo progetto
  • storage.buckets.get nel tuo progetto
  • storage.objects.create nel tuo progetto
  • storage.objects.delete nel tuo progetto
  • storage.objects.get nel tuo progetto
  • storage.objects.list nel tuo progetto

Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

Creare tabelle Iceberg

Per creare una tabella Iceberg, seleziona uno dei seguenti metodi:

SQL

CREATE TABLE [PROJECT_NAME.]DATASET_NAME.TABLE_NAME (
COLUMN DATA_TYPE[, ...]
)
CLUSTER BY CLUSTER_COLUMN_LIST
WITH CONNECTION CONNECTION_NAME
OPTIONS (
file_format = 'PARQUET',
table_format = 'ICEBERG',
storage_uri = 'STORAGE_URI');

Sostituisci quanto segue:

  • PROJECT_NAME: il progetto contenente il set di dati. Se non è definito, il comando presuppone il progetto predefinito.
  • DATASET_NAME: un set di dati esistente.
  • TABLE_NAME: il nome della tabella che stai creando.
  • DATA_TYPE: il tipo di dati delle informazioni contenute nella colonna.
  • CLUSTER_COLUMN_LIST: un elenco separato da virgole contenente fino a quattro colonne. Devono essere colonne di primo livello non ripetute.
  • CONNECTION_NAME: il nome della connessione. Ad esempio, myproject.us.myconnection.
  • STORAGE_URI: un URI Cloud Storage completamente qualificato. Ad esempio: gs://mybucket/table.

bq

bq --project_id=PROJECT_NAME mk \
    --file_format=PARQUET \
    --table_format=ICEBERG \
    --connection_id=CONNECTION_NAME \
    --storage_uri=STORAGE_URI \
    --schema=COLUMN_NAME:DATA_TYPE[, ...] \
    --clustering_fields=CLUSTER_COLUMN_LIST \
    MANAGED_TABLE_NAME

Sostituisci quanto segue:

  • PROJECT_NAME: il progetto contenente il set di dati. Se non è definito, il comando presuppone il progetto predefinito.
  • CONNECTION_NAME: il nome della connessione. Ad esempio, myproject.us.myconnection.
  • STORAGE_URI: un URI Cloud Storage completamente qualificato. Ad esempio: gs://mybucket/table.
  • COLUMN_NAME: il nome della colonna.
  • DATA_TYPE: il tipo di dati delle informazioni contenute nella colonna.
  • CLUSTER_COLUMN_LIST: un elenco separato da virgole contenente fino a quattro colonne. Devono essere colonne di primo livello non ripetute.
  • MANAGED_TABLE_NAME: il nome della tabella che stai creando.

API

Chiama il metodo tables.insert con una risorsa tabella definita, simile al seguente:

{
"tableReference": {
  "tableId": "TABLE_NAME"
},
"biglakeConfiguration": {
  "connectionId": "CONNECTION_NAME",
  "fileFormat": "PARQUET",
  "tableFormat": "ICEBERG",
  "storageUri": "STORAGE_URI"
},
"schema": {
  "fields": [
    {
      "name": "COLUMN_NAME",
      "type": "DATA_TYPE"
    }
    [, ...]
  ]
}
}

Sostituisci quanto segue:

  • TABLE_NAME: il nome della tabella che stai creando.
  • CONNECTION_NAME: il nome della connessione. Ad esempio, myproject.us.myconnection.
  • STORAGE_URI: un URI Cloud Storage completamente qualificato. Sono supportati anche i caratteri jolly. Ad esempio, gs://mybucket/table.
  • COLUMN_NAME: il nome della colonna.
  • DATA_TYPE: il tipo di dati delle informazioni contenute nella colonna.

Importare i dati nella tabella Iceberg

Le sezioni seguenti descrivono come importare i dati da vari formati di tabelle nelle tabelle Iceberg.

Caricamento rapido da file Parquet

L'opzione copy_files_only ti consente di caricare i dati più velocemente copiando i file Parquet esistenti, anziché leggere i contenuti e riscriverli come nuovi file. Il caricamento rapido utilizza meno capacità di calcolo rispetto a un normale caricamento di file. I file Parquet devono essere compatibili con la specifica Apache Iceberg e avere statistiche complete delle colonne. Il caricamento rapido non rileva valori non validi (ad esempio timestamp fuori intervallo) nei file perché i file non vengono letti e sottoposti a nuovo trattamento. Per ulteriori informazioni sul caricamento dei file Parquet, consulta Caricare i dati Parquet in una nuova tabella.

Per caricare rapidamente file Parquet a struttura piatta in una tabella Iceberg esistente, utilizza il comando bq load:

bq load \
    --copy_files_only \
    --source_format=PARQUET \
    DATASET_NAME.TABLE_NAME \
    PATH_TO_SOURCE

Sostituisci quanto segue:

  • DATASET_NAME: il set di dati contenente la tabella Iceberg.
  • TABLE_NAME: il nome della tabella Iceberg in cui carichi i dati.
  • PATH_TO_SOURCE: un URI Cloud Storage completo o un elenco di URI separati da virgole. Sono supportati anche i caratteri jolly. Ad esempio, gs://mybucket/mydata*.parquet.

Caricamento standard dei dati da file di tipo flat

Le tabelle Iceberg utilizzano i job di caricamento BigQuery per caricare file esterni nelle tabelle Iceberg. Se hai già una tabella Iceberg, segui la guida all'interfaccia a riga di comando bq load o la guida a SQL LOAD per caricare i dati esterni. Dopo aver caricato i dati, i nuovi file Parquet vengono scritti nella cartella STORAGE_URI/data.

Se le istruzioni precedenti vengono utilizzate senza una tabella Iceberg esistente, viene creata una tabella BigQuery.

Di seguito sono riportati esempi specifici dello strumento di caricamenti batch nelle tabelle gestite:

SQL

LOAD DATA INTO MANAGED_TABLE_NAME
FROM FILES (
uris=['STORAGE_URI'],
format='FILE_FORMAT');

Sostituisci quanto segue:

  • MANAGED_TABLE_NAME: il nome di una tabella Iceberg esistente.
  • STORAGE_URI: un URI Cloud Storage completo o un elenco di URI separati da virgole. Sono supportati anche i caratteri jolly. Ad esempio, gs://mybucket/table.
  • FILE_FORMAT: il formato della tabella di origine. Per i formati supportati, consulta la riga format di load_option_list.

bq

bq load \
  --source_format=FILE_FORMAT \
  MANAGED_TABLE \
  STORAGE_URI

Sostituisci quanto segue:

  • FILE_FORMAT: il formato della tabella di origine. Per i formati supportati, consulta la riga format di load_option_list.
  • MANAGED_TABLE_NAME: il nome di una tabella Iceberg esistente.
  • STORAGE_URI: un URI Cloud Storage completo o un elenco di URI separati da virgole. Sono supportati anche i caratteri jolly. Ad esempio, gs://mybucket/table.

Caricamento standard da file partizionati Hive

Puoi caricare file partizionati da Hive nelle tabelle Iceberg utilizzando i job di caricamento BigQuery standard. Per ulteriori informazioni, consulta Caricamento di dati partizionati esternamente.

Caricare i flussi di dati da Pub/Sub

Puoi caricare i dati in streaming nelle tabelle Iceberg utilizzando un abbonamento BigQuery Pub/Sub.

Esportare i dati dalle tabelle Iceberg

Le sezioni seguenti descrivono come esportare i dati dalle tabelle Iceberg in vari formati di tabella.

Esportare i dati in formati semplici

Per esportare una tabella Iceberg in un formato piatto, utilizza l'istruzione EXPORT DATA e seleziona un formato di destinazione. Per saperne di più, consulta Esportazione di dati.

Leggere le tabelle Iceberg con i metadati Iceberg

Per leggere i dati dalle tabelle Iceberg in formato Iceberg:

  1. Esporta i metadati nel formato Iceberg con l'istruzione SQL EXPORT TABLE METADATA.

  2. Configura e leggi i dati delle tabelle in Apache Spark con HadoopCatalog.

    Il seguente esempio configura l'ambiente per l'utilizzo di Spark SQL con Apache Iceberg ed esegue una query per recuperare i dati da una tabella Iceberg specificata.

    spark-sql \
     --packages org.apache.iceberg:iceberg-spark-runtime-ICEBERG_VERSION_NUMBER \
     --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
     --conf spark.sql.catalog.CATALOG_NAME.type=hadoop \
     --conf spark.sql.catalog.CATALOG_NAME.warehouse='BUCKET_PATH' \
    
    # Queries the table
    spark-sql> SELECT * FROM CATALOG_NAME.FOLDER_NAME;

    Sostituisci quanto segue:

    • ICEBERG_VERSION_NUMBER: la versione corrente del runtime Apache Spark Iceberg. Scarica la versione più recente da Spark Releases.
    • CATALOG_NAME: il catalogo a cui fare riferimento per la tabella Iceberg.
    • BUCKET_PATH: il percorso del bucket contenente i file delle tabelle. Ad esempio, gs://mybucket/.
    • FOLDER_NAME: la cartella contenente i file della tabella. Ad esempio, myfolder.

Modificare le tabelle Iceberg

Per modificare una tabella Iceberg, segui la procedura descritta in Modifica degli schemi delle tabelle.

Prezzi

I prezzi delle tabelle iceberg sono costituiti da tre componenti distinti:

Archiviazione

La tabella Iceberg archivia tutti i dati in Cloud Storage. Ti vengono addebitati tutti i dati memorizzati, inclusi i dati storici delle tabelle. Potrebbero essere applicati anche costi per l'elaborazione dei dati e i trasferimenti di Cloud Storage, a seconda dei casi. Non sono previste tariffe di archiviazione specifiche per BigQuery. Per maggiori informazioni, consulta la pagina Prezzi di Cloud Storage.

Ottimizzazione dello spazio di archiviazione

Le tabelle Iceberg richiedono operazioni di ottimizzazione dello spazio di archiviazione, come l'unione di file e il ricoinvolgimento. Queste operazioni di ottimizzazione utilizzano slot di pagamento a consumo della versione Enterprise e non utilizzano le prenotazioni BACKGROUND esistenti.

Le operazioni di esportazione dei dati che si verificano durante lo streaming tramite l'API BigQuery Storage Write sono incluse nei prezzi dell'API Storage Write e non vengono addebitate come manutenzione in background. Per ulteriori informazioni, consulta Prezzi dell'importazione dati.

Query e job

Come per le tabelle BigQuery, ti vengono addebitati i costi per le query e i byte letti (per TiB) se utilizzi prezzi on demand di BigQuery, o per il consumo di slot (per ora di slot) se utilizzi prezzi di calcolo della capacità di BigQuery.

I prezzi di BigQuery si applicano anche all'API BigQuery Storage Read e all'API BigQuery Storage Write.

Le operazioni di caricamento ed esportazione (ad esempio EXPORT METADATA) utilizzano slot con pagamento a consumo della versione Enterprise. Ciò è diverso dalle tabelle BigQuery, per le quali non vengono addebitate queste operazioni. Se sono disponibili prenotazioni PIPELINE con Enterprise o Enterprise Plus, le operazioni di caricamento ed esportazione utilizzeranno preferenzialmente questi slot di prenotazione.

Limitazioni

Le tabelle iceberg presentano le seguenti limitazioni: