Crea tabelle esterne Apache Iceberg

Le tabelle esterne Apache Iceberg ti consentono di accedere alle tabelle Apache Iceberg in un formato di sola lettura con controllo dell'accesso più granulare, tra cui la sicurezza a livello di riga e di colonna e il mascheramento dei dati. Queste tabelle non sono più consigliate per la maggior parte dei casi d'uso. Consulta invece le alternative consigliate.

A seconda di dove sono archiviati i dati, ti consigliamo le seguenti alternative per accedere alle tabelle Iceberg i cui metadati non sono gestiti daCloud de Confiance by S3NS:

  • Dati di Cloud Storage o Amazon Simple Storage Service (Amazon S3) gestiti da cataloghi remoti come AWS Glue, Databricks Unity Catalog e Snowflake Horizon Catalog. Utilizza il catalogo di runtime Lakehouse con accesso ai dati cross-cloud. La funzionalità di accesso ai dati cross-cloud del catalogo di runtime Lakehouse ti consente di eseguire query sui dati in altri cloud provider direttamente da Cloud de Confiance by S3NS senza migrare i file o creare pipeline ETL complesse.
  • Tabelle Azure Blob Storage o Apache Iceberg non gestite da un catalogo remoto supportato per il catalogo di runtime Lakehouse con accesso ai dati cross-cloud. Continua con le tabelle esterne Apache Iceberg che utilizzano file di metadati JSON Iceberg.

Supporto di formati e versioni di Iceberg

Iceberg è un formato di tabella open source che supporta tabelle di dati su scala petabyte. La specifica aperta di Iceberg ti consente di eseguire più motori di query su una singola copia dei dati archiviati in un datastore di oggetti. Le tabelle esterne Iceberg supportano Iceberg versione 2, incluso merge-on-read. Il supporto per Iceberg versione 3, inclusi i vettori di eliminazione binari, è in anteprima. Per fornire feedback o porre domande relative a questa funzionalità in anteprima, contatta biglake-help@google.com.

Prima di iniziare

Abilita le API BigQuery Connection e BigQuery Reservation, se non sono già abilitate.

Ruoli richiesti per abilitare le API

Per abilitare le API, devi disporre dell'autorizzazione serviceusage.services.enable. Se hai creato il progetto, probabilmente hai già questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore Service Usage (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.

Abilita le API

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per creare una tabella esterna Iceberg, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:

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

Questi ruoli predefiniti contengono le autorizzazioni necessarie per creare una tabella esterna Iceberg. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

Per creare una tabella esterna Iceberg sono necessarie le seguenti autorizzazioni:

  • bigquery.tables.create
  • bigquery.connections.delegate
  • bigquery.jobs.create

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

Crea tabelle con un file di metadati

Puoi creare tabelle esterne Iceberg con un file di metadati JSON. Tuttavia, devi aggiornare manualmente l'URI del file di metadati JSON per mantenere aggiornata la tabella esterna Iceberg. Se l'URI non viene aggiornato, le query in BigQuery possono non riuscire o fornire risultati diversi rispetto ad altri motori di query che utilizzano direttamente un catalogo Iceberg.

I file dei metadati della tabella Iceberg vengono creati nel bucket Cloud Storage che specifichi quando crei una tabella Iceberg utilizzando Spark.

Seleziona una delle seguenti opzioni:

SQL

Utilizza l'istruzione CREATE EXTERNAL TABLE. L'esempio seguente crea una tabella esterna Iceberg denominata myexternal-table:

  CREATE EXTERNAL TABLE myexternal-table
  WITH CONNECTION `myproject.us.myconnection`
  OPTIONS (
         format = 'ICEBERG',
         uris = ["gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json"]
   )

Sostituisci il valore uris con il file di metadati JSON più recente per uno snapshot della tabella specifico.

Puoi attivare il filtro di partizione obbligatorio impostando il flag require_partition_filter.

bq

In un ambiente a riga di comando, utilizza il comando bq mk --table con il decoratore @connection per specificare la connessione da utilizzare alla fine del parametro --external_table_definition. Per attivare il filtro di partizionamento obbligatorio, utilizza --require_partition_filter.

bq mk 
--table
--external_table_definition=TABLE_FORMAT=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID
PROJECT_ID:DATASET.EXTERNAL_TABLE

Sostituisci quanto segue:

  • TABLE_FORMAT: il formato della tabella che vuoi creare

    In questo caso, ICEBERG.

  • URI: l'ultimo file di metadati JSON per uno snapshot della tabella specifico.

    Ad esempio, gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json.

    L'URI può anche puntare a una posizione cloud esterna, come Amazon S3 o Azure Blob Storage.

    • Esempio per AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Esempio per Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.
  • CONNECTION_PROJECT_ID: il progetto che contiene la connessione per creare la tabella esterna Iceberg, ad esempio myproject

  • CONNECTION_REGION: la regione che contiene la connessione per creare la tabella esterna Iceberg, ad esempio us

  • CONNECTION_ID: l'ID connessione della tabella, ad esempio myconnection

    Quando visualizzi i dettagli della connessione nella console Cloud de Confiance , l'ID connessione è il valore nell'ultima sezione dell'ID connessione completo mostrato in ID connessione, ad esempio projects/myproject/locations/connection_location/connections/myconnection

  • DATASET: il nome del set di dati BigQuery in cui vuoi creare una tabella

    Ad esempio, mydataset.

  • EXTERNAL_TABLE: il nome della tabella che vuoi creare

    Ad esempio, mytable.

Aggiornamento metadati tabella

Se utilizzi un file di metadati JSON per creare una tabella esterna Iceberg, aggiorna la definizione della tabella ai metadati della tabella più recenti. Per aggiornare lo schema o il file dei metadati, seleziona una delle seguenti opzioni:

bq

  1. Crea un file di definizione della tabella:

    bq mkdef --source_format=ICEBERG \
    "URI" > TABLE_DEFINITION_FILE
    
  2. Utilizza il comando bq update con il flag --autodetect_schema:

    bq update --autodetect_schema --external_table_definition=TABLE_DEFINITION_FILE
    PROJECT_ID:DATASET.TABLE
    

    Sostituisci quanto segue:

    • URI: l'URI Cloud Storage con il file di metadati JSON più recente

      Ad esempio, gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.

    • TABLE_DEFINITION_FILE: il nome del file contenente lo schema della tabella

    • PROJECT_ID: l'ID progetto contenente la tabella che vuoi aggiornare

    • DATASET: il set di dati contenente la tabella che vuoi aggiornare

    • TABLE: la tabella che vuoi aggiornare

API

Utilizza il metodo tables.patch con la proprietà autodetect_schema impostata su true:

PATCH https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables/TABLE?autodetect_schema=true

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto che contiene la tabella che vuoi aggiornare
  • DATASET: il set di dati contenente la tabella che vuoi aggiornare
  • TABLE: la tabella che vuoi aggiornare

Nel corpo della richiesta, specifica i valori aggiornati per i seguenti campi:

{
     "externalDataConfiguration": {
      "sourceFormat": "ICEBERG",
      "sourceUris": [
        "URI"
      ]
    },
    "schema": null
  }'

Sostituisci URI con il file di metadati Iceberg più recente. Ad esempio, gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.

Configura le policy di controllo dell'accesso

Puoi controllare l'accesso alle tabelle esterne Iceberg tramite la sicurezza a livello di colonna, la sicurezza a livello di riga e il mascheramento dei dati.

In qualità di amministratore di BigQuery, puoi applicare controllo dell'accesso a livello di riga e di colonna, incluso il mascheramento dei dati nelle tabelle. Le policy di accesso alle tabelle vengono applicate anche quando utilizzi l'API BigQuery Storage come origine dati per la tabella in Managed Service for Apache Spark e Serverless Spark.

Esegui query sui dati storici

Puoi accedere agli snapshot delle tabelle esterne Iceberg conservati nei metadati Iceberg utilizzando la clausola FOR SYSTEM_TIME AS OF.

Le finestre di conservazione dei dati di viaggio nel tempo e di sicurezza non sono supportate per le tabelle esterne.

Mappatura dei dati

BigQuery converte i tipi di dati Iceberg in tipi di dati BigQuery come mostrato nella tabella seguente:

Tipo di dati Iceberg Tipo di dati BigQuery
boolean BOOL
int INT64
long INT64
float FLOAT64
double FLOAT64
Decimal(P/S) NUMERIC or BIG_NUMERIC depending on precision
date DATE
time TIME
timestamp DATETIME
timestamptz TIMESTAMP
string STRING
uuid BYTES
fixed(L) BYTES
binary BYTES
list<Type> ARRAY<Type>
struct STRUCT
map<KeyType, ValueType> ARRAY<Struct<key KeyType, value ValueType>>

Limitazioni

Oltre alle limitazioni delle tabelle esterne, le tabelle esterne Iceberg presentano le seguenti limitazioni:

  • Le query che utilizzano i Controlli di servizio VPC non sono supportate e generano un errore come NO_MATCHING_ACCESS_LEVEL.

  • Le tabelle che utilizzano l'unione in lettura presentano le seguenti limitazioni:

    • Una query può elaborare fino a 100.000 voci totali del vettore di eliminazione nella tabella. Per le tabelle Iceberg versione 3 che utilizzano vettori di eliminazione binari, ogni file di dati associato a un vettore di eliminazione viene conteggiato come una voce di eliminazione ai fini di questo limite.
    • Ogni file di dati può essere associato a un massimo di 10.000 file di eliminazione.
    • A un file di dati non possono essere applicate più di 100.000 eliminazioni di uguaglianza.
    • Puoi aggirare queste limitazioni compattando spesso i file di eliminazione e i vettori di eliminazione, creando una vista sopra la tabella Iceberg che eviti le partizioni mutate di frequente o filtrando le query sulle colonne partizionate per ridurre il numero di file di dati e vettori di eliminazione scansionati.
  • BigQuery supporta la riduzione del manifest utilizzando tutte le funzioni di trasformazione delle partizioni Iceberg. Per informazioni su come eliminare le partizioni, consulta Esegui query su tabelle partizionate. Le query che fanno riferimento a tabelle esterne Iceberg devono contenere valori letterali nei predicati rispetto alle colonne partizionate.

  • Sono supportati solo i file di dati Apache Parquet.

  • Nomi delle colonne flessibili:

    • Se una tabella esterna Iceberg è partizionata in base a una colonna contenente caratteri non alfanumerici, BigQuery potrebbe non essere in grado di estrarre i metadati della partizione dal manifest, il che può comportare una scansione completa della tabella.
    • Le tabelle Iceberg contenenti caratteri strutturali (come punti ., simboli di dollaro $, parentesi quadre [], parentesi tonde () o barre /) non possono essere interrogate direttamente da BigQuery. Se il tuo workflow richiede la registrazione di queste tabelle nel catalogo di runtime o nei servizi di catalogo di Lakehouse per l'utilizzo esclusivo con motori esterni (come Spark o Trino), contatta l'assistenza clienti Google Cloud per richiedere l'abilitazione a livello di progetto.
  • Le seguenti funzionalità della versione 3 di Iceberg non sono supportate:

    • Nuovi tipi di dati: timestamp(tz) in nanosecondi, sconosciuto, variante, geometria, geografia
    • Valori predefiniti iniziali
    • Chiavi di crittografia della tabella

Costi di unione in lettura

La fatturazione on demand per i dati di unione in lettura è la somma delle scansioni dei seguenti dati:

  • Tutti i byte logici letti nel file di dati (incluse le righe contrassegnate come eliminate dalle eliminazioni per posizione e per uguaglianza).
  • Byte logici letti durante il caricamento dei file di eliminazione di uguaglianza, eliminazione di posizione e vettore di eliminazione per trovare le righe eliminate in un file di dati.

Richiedi filtro di partizionamento

Puoi richiedere l'utilizzo di filtri di predicato attivando l'opzione Richiedi filtro di partizionamento per la tabella Iceberg. Se attivi questa opzione, i tentativi di eseguire query sulla tabella senza specificare una clausola WHERE che corrisponda a ogni file manifest genereranno il seguente errore:

Cannot query over table project_id.dataset.table without a
filter that can be used for partition elimination.

Ogni file manifest richiede almeno un predicato adatto all'eliminazione delle partizioni.

Puoi attivare require_partition_filter nei seguenti modi durante la creazione di una tabella Iceberg :

SQL

Utilizza l'istruzione CREATE EXTERNAL TABLE.L'esempio seguente crea una tabella esterna Iceberg denominata TABLE con il filtro di partizionamento obbligatorio abilitato:

  CREATE EXTERNAL TABLE TABLE
  WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
  OPTIONS (
         format = 'ICEBERG',
         uris = [URI],
         require_partition_filter = true
   )

Sostituisci quanto segue:

  • TABLE: il nome della tabella che vuoi creare.
  • PROJECT_ID: l'ID progetto contenente la tabella che vuoi creare.
  • REGION: la località in cui vuoi creare la tabella Iceberg.
  • CONNECTION_ID: l'ID connessione. Ad esempio: myconnection.

  • URI: l'URI Cloud Storage con il file di metadati JSON più recente.

    Ad esempio, gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.

    L'URI può anche puntare a una posizione cloud esterna, come Amazon S3 o Azure Blob Storage.

    • Esempio per AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Esempio per Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.

bq

Utilizza il comando bq mk --table con il decoratore @connection per specificare la connessione da utilizzare alla fine del parametro --external_table_definition. Utilizza --require_partition_filter per attivare il filtro di partizionamento obbligatorio. L'esempio seguente crea una tabella esterna Iceberg denominata TABLE con il filtro di partizionamento obbligatorio abilitato:

bq mk \
    --table \
    --external_table_definition=ICEBERG=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID \
    PROJECT_ID:DATASET.EXTERNAL_TABLE \
    --require_partition_filter

Sostituisci quanto segue:

  • URI: l'ultimo file di metadati JSON per uno snapshot della tabella specifico

    Ad esempio, gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json.

    L'URI può anche puntare a una posizione cloud esterna, come Amazon S3 o Azure Blob Storage.

    • Esempio per AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Esempio per Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.
  • CONNECTION_PROJECT_ID: il progetto che contiene la connessione per creare la tabella esterna Iceberg, ad esempio myproject

  • CONNECTION_REGION: la regione che contiene la connessione per creare la tabella esterna Iceberg. Ad esempio: us.

  • CONNECTION_ID: l'ID connessione. Ad esempio: myconnection.

    Quando visualizzi i dettagli della connessione nella console Cloud de Confiance , l'ID connessione è il valore nell'ultima sezione dell'ID connessione completo mostrato in ID connessione, ad esempio projects/myproject/locations/connection_location/connections/myconnection

  • DATASET: il nome del set di dati BigQuery

    il set di dati che contiene la tabella che vuoi aggiornare. Ad esempio, mydataset.

  • EXTERNAL_TABLE: il nome della tabella che vuoi creare

    Ad esempio, mytable.

Puoi anche aggiornare la tabella Iceberg per attivare il filtro di partizione richiesto.

Se non attivi l'opzione Richiedi filtro di partizione quando crei la tabella partizionata, puoi aggiornare la tabella per aggiungere l'opzione.

bq

Utilizza il comando bq update e specifica il flag --require_partition_filter.

Ad esempio:

Per aggiornare mypartitionedtable in mydataset nel progetto predefinito, inserisci:

bq update --require_partition_filter PROJECT_ID:DATASET.TABLE

Passaggi successivi