Crea tabelle esterne di sola lettura Apache Iceberg
Le tabelle esterne di sola lettura Apache Iceberg ti consentono di accedere alle tabelle Apache Iceberg con controllo dell'accesso più granulare in un formato di sola lettura. Questa funzionalità è diversa dalle tabelle BigLake per Apache Iceberg in BigQuery, che consente di creare tabelle Iceberg in BigQuery in un formato scrivibile.
Iceberg è un formato di tabella open source che supporta tabelle di dati su scala petabyte. La specifica aperta di Iceberg consente di eseguire più motori di query su una singola copia dei dati archiviati in un archivio di oggetti. Le tabelle esterne di sola lettura Apache Iceberg (di seguito chiamate tabelle di sola lettura Iceberg) supportano la specifica Iceberg versione 2, inclusa la funzionalità di unione in lettura.
In qualità di amministratore BigQuery, puoi applicare controllo dell'accesso a livello di riga e colonna, inclusa la maschera dei dati nelle tabelle. Per informazioni su come configurare il controllo dell'accesso dell'accesso a livello di tabella, vedi Configurare i criteri di controllo dell'accesso dell'accesso. I criteri di accesso alle tabelle vengono applicati anche quando utilizzi l'API BigQuery Storage come origine dati per la tabella in Dataproc e Serverless Spark.
Puoi creare tabelle Iceberg di sola lettura nei seguenti modi:
Con BigLake Metastore (consigliato per Google Cloud). Il metastore BigLake si basa sul catalogo BigQuery e si integra direttamente con BigQuery. Le tabelle nel metastore BigLake sono modificabili da più motori open source e le stesse tabelle possono essere sottoposte a query da BigQuery. BigLake Metastore supporta anche l'integrazione diretta con Apache Spark.
Con AWS Glue Data Catalog (consigliato per AWS). AWS Glue è il metodo consigliato per AWS perché è un repository di metadati centralizzato in cui definisci la struttura e la posizione dei dati archiviati in vari servizi AWS e fornisce funzionalità come il rilevamento automatico dello schema e l'integrazione con gli strumenti di analisi AWS.
Con i file di metadati JSON Iceberg (consigliato per Azure). Se utilizzi un file JSON con i metadati Iceberg, devi aggiornare manualmente l'ultimo file di metadati ogni volta che vengono apportati aggiornamenti alla tabella. Puoi utilizzare una stored procedure BigQuery per Apache Spark per creare tabelle di sola lettura Iceberg che fanno riferimento a un file di metadati Iceberg.
Per un elenco completo delle limitazioni, vedi Limitazioni.
Prima di iniziare
Enable the BigQuery Connection and BigQuery Reservation APIs.
Se utilizzi una stored procedure per Spark in BigQuery per creare tabelle Iceberg di sola lettura, devi seguire questi passaggi:
Per archiviare i metadati e i file di dati della tabella di sola lettura Iceberg in Cloud Storage, crea un bucket Cloud Storage. Devi connetterti al bucket Cloud Storage per accedere ai file di metadati. Per farlo, segui questi passaggi:
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per creare una tabella Iceberg di sola lettura, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
BigQuery Admin (
roles/bigquery.admin
) -
Storage Object Admin (
roles/storage.objectAdmin
)
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 di sola lettura Iceberg. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:
Autorizzazioni obbligatorie
Per creare una tabella di sola lettura 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 BigLake Metastore
Ti consigliamo di creare tabelle Iceberg di sola lettura con BigLake Metastore. Puoi utilizzare Apache Spark per creare queste tabelle. Un modo pratico per farlo è utilizzare le stored procedure BigQuery. Per un esempio, vedi Creare ed eseguire una stored procedure.
Crea tabelle con un file di metadati
Puoi creare tabelle Iceberg di sola lettura con un file di metadati JSON. Tuttavia, questo non è il metodo consigliato perché devi aggiornare manualmente l'URI del file JSON con i metadati per mantenere aggiornata la tabella Iceberg di sola lettura. 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 di metadati della tabella Iceberg vengono creati nel bucket Cloud Storage specificato quando crei una tabella Iceberg utilizzando Spark.
Seleziona una delle seguenti opzioni:
SQL
Utilizza l'istruzione CREATE EXTERNAL TABLE
. Il seguente esempio crea una
tabella di sola lettura 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 l'ultimo file di metadati JSON per uno snapshot specifico della tabella.
Puoi attivare l'opzione Richiedi filtro di partizionamento 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 creareIn questo caso,
ICEBERG
.URI
: l'ultimo file di metadati JSON per uno snapshot di una tabella specifica.Ad esempio,
gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json
.L'URI può puntare anche a una posizione cloud esterna, ad esempio 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
.
- Esempio per AWS:
CONNECTION_PROJECT_ID
: il progetto che contiene la connessione per creare la tabella di sola lettura Iceberg, ad esempiomyproject
CONNECTION_REGION
: la regione che contiene la connessione per creare la tabella di sola lettura Iceberg, ad esempious
CONNECTION_ID
: l'ID connessione alla tabella, ad esempiomyconnection
Quando visualizzi i dettagli della connessione nella console Google Cloud , 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 tabellaAd esempio,
mydataset
.EXTERNAL_TABLE
: il nome della tabella che vuoi creareAd esempio,
mytable
.
Aggiornamento metadati tabella
Se utilizzi un file di metadati JSON per creare una tabella di sola lettura Iceberg, aggiorna la definizione della tabella con i metadati più recenti. Per aggiornare lo schema o il file di metadati, seleziona una delle seguenti opzioni:
bq
Crea un file di definizione della tabella:
bq mkdef --source_format=ICEBERG \ "URI" > TABLE_DEFINITION_FILE
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 l'ultimo file di metadati JSONAd esempio,
gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json
.TABLE_DEFINITION_FILE
: il nome del file contenente lo schema della tabellaPROJECT_ID
: l'ID progetto contenente la tabella che vuoi aggiornareDATASET
: il set di dati contenente la tabella che vuoi aggiornareTABLE
: 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 aggiornareDATASET
: il set di dati contenente la tabella che vuoi aggiornareTABLE
: 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 i criteri di controllo dell'accesso
Puoi controllare l'accesso alle tabelle di sola lettura Iceberg tramite sicurezza a livello di colonna, sicurezza a livello di riga e mascheramento dei dati.
Eseguire query sulle tabelle Iceberg di sola lettura
Per maggiori informazioni, consulta Eseguire query sui dati Iceberg.
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
Le tabelle di sola lettura Iceberg presentano limitazioni delle tabelle esterne e le seguenti limitazioni:
Le tabelle che utilizzano la funzionalità Merge-on-Read presentano le seguenti limitazioni:
- Ogni file di dati può essere associato a un massimo di 10.000 file di eliminazione.
- A un file di eliminazione non possono essere applicati più di 100.000 ID uguaglianza.
- Puoi aggirare queste limitazioni compattando spesso i file di eliminazione o creando una visualizzazione sopra la tabella Iceberg che eviti le partizioni mutate di frequente.
BigQuery supporta l'eliminazione dei manifest utilizzando tutte le funzioni di trasformazione delle partizioni Iceberg, ad eccezione di
Bucket
. Per informazioni su come eliminare le partizioni, consulta Esecuzione di query sulle tabelle partizionate. Le query che fanno riferimento a tabelle Iceberg di sola lettura devono contenere valori letterali nei predicati rispetto alle colonne partizionate.Sono supportati solo i file di dati Apache Parquet.
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 per posizione ed eliminazioni di uguaglianza).
- Byte logici letti durante il caricamento dei file di eliminazione per uguaglianza ed eliminazione per posizione 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 abiliti questa opzione, i tentativi di eseguire query sulla tabella senza specificare una
clausola WHERE
che si allinei a ogni file manifest produrranno 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
.Il seguente esempio
crea una tabella Iceberg di sola lettura 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 posizione in cui vuoi creare la tabella Iceberg.CONNECTION_ID
: l'ID connessione. Ad esempio:myconnection
.URI
: l'URI Cloud Storage con l'ultimo file JSON di metadati.Ad esempio,
gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json
.L'URI può puntare anche a una posizione cloud esterna, ad esempio 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
.
- Esempio per AWS:
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 di sola lettura 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 di una tabella specificaAd esempio,
gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json
.L'URI può puntare anche a una posizione cloud esterna, ad esempio 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
.
- Esempio per AWS:
CONNECTION_PROJECT_ID
: il progetto che contiene la connessione per creare la tabella Iceberg di sola lettura, ad esempiomyproject
CONNECTION_REGION
: la regione che contiene la connessione per creare la tabella Iceberg di sola lettura. Ad esempio:us
.CONNECTION_ID
: : l'ID connessione. Ad esempio:myconnection
.Quando visualizzi i dettagli della connessione nella console Google Cloud , 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 di BigQueryil set di dati che contiene la tabella da aggiornare. Ad esempio,
mydataset
.EXTERNAL_TABLE
: il nome della tabella che vuoi creareAd esempio,
mytable
.
Puoi anche aggiornare la tabella Iceberg per attivare il filtro di partizionamento richiesto.
Se non abiliti l'opzione Richiedi filtro di partizionamento quando crei la tabella partizionata, puoi aggiornarla per aggiungere l'opzione.
bq
Utilizza il comando bq update
e fornisci 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
- Scopri di più sulla stored procedure per Spark.
- Scopri di più sulle norme di controllo dell'accesso.
- Scopri di più sull'esecuzione di query in BigQuery.
- Scopri di più sulle istruzioni e sui dialetti SQL supportati in BigQuery.