Esporta i dati come colonne Protobuf
Le funzioni definite dall'utente (UDF) in BigQuery consentono di esportare i dati come colonne di buffer di protocollo (Protobuf). Le colonne Protobuf forniscono alle tue applicazioni oggetti completamente tipizzati e possono ridurre le dimensioni dei dati, i tempi di trasferimento e i costi rispetto a JSON.
Quando utilizzare le colonne Protobuf
BigQuery offre una serie di funzioni integrate per formattare i dati selezionati. Un'opzione è unire più valori di colonna in un unico valore Protobuf, il che offre i seguenti vantaggi:
- Sicurezza dei tipi di oggetti.
- Compressione, tempi di trasferimento dei dati e costi migliorati rispetto a JSON.
- Flessibilità, poiché la maggior parte dei linguaggi di programmazione dispone di librerie per gestire Protobuf.
- Meno overhead durante la lettura da più colonne e la creazione di un singolo oggetto.
Sebbene anche altri tipi di colonne possano fornire la sicurezza dei tipi, l'utilizzo delle colonne Protobuf fornisce un oggetto completamente tipizzato, che può ridurre la quantità di lavoro da svolgere sul livello di applicazione o su un'altra parte della pipeline.
Tuttavia, esistono limitazioni all'esportazione dei dati BigQuery come colonne Protobuf:
- Le colonne Protobuf non sono indicizzate o filtrate correttamente. La ricerca in base ai contenuti delle colonne Protobuf può essere meno efficace.
- L'ordinamento dei dati in formato Protobuf può essere difficile.
Se queste limitazioni si applicano al workflow di esportazione, puoi prendere in considerazione altri metodi di esportazione dei dati di BigQuery:
- Utilizza le query pianificate con le istruzioni
EXPORT DATAper ordinare i dati BigQuery esportati in base alla data o all'ora e per pianificare le esportazioni su base ricorrente. BigQuery supporta l'esportazione dei dati nei formati Avro, CSV, JSON e Parquet. - Utilizza Dataflow per esportare i dati di BigQuery nel formato file Avro o CSV.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per esportare i dati BigQuery come colonne Protobuf, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
Creare una funzione definita dall'utente;utente:
BigQuery Data Editor (
roles/bigquery.dataEditor) -
Esportare i dati da una tabella BigQuery:
Visualizzatore dati BigQuery (
roles/bigquery.dataViewer) -
Leggere e caricare file su Cloud Storage:
Storage Object Creator (
roles/storage.objectCreator)
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.
Crea una funzione definita dall'utente
Crea una funzione definita dall'utente che converte un tipo di dati STRUCT BigQuery in una colonna Protobuf:
In una riga di comando, clona il repository
bigquery-utils.git:git clone https://github.com/GoogleCloudPlatform/bigquery-utils.gitVai alla cartella di esportazione di Protobuf:
cd bigquery-utils/tools/protobuf_exportUtilizza il comando
cpo il browser di file del tuo sistema operativo per copiare il file proto nella cartella secondaria./protos.Nella cartella
./protosè già presente un file proto di esempio denominatodummy.proto.Installa i pacchetti necessari dal repository GitHub:
npm installCrea il bundle del pacchetto utilizzando webpack:
npx webpack --config webpack.config.js --stats-error-detailsIndividua il file
pbwrapper.jsnella cartella secondaria./dist, quindi carica il file in un bucket Cloud Storage.Vai alla pagina BigQuery.
Utilizzando l'editor di query, crea una funzione definita dall'utente denominata
toMyProtoMessageche genera una colonna Protobuf dalle colonne della tabella BigQuery esistenti:CREATE FUNCTION DATASET_ID.toMyProtoMessage(input STRUCT<INPUT_FIELDS>) RETURNS BYTES LANGUAGE js OPTIONS ( library=["gs://BUCKET_NAME/pbwrapper.js"] ) AS r""" let message = pbwrapper.setup("PROTO_PACKAGE.PROTO_MESSAGE") return pbwrapper.parse(message, input) """;Sostituisci quanto segue:
DATASET_ID: l'ID del set di dati che conterrà la funzione definita dall'utente.INPUT_FIELDS: i campi utilizzati nel tipo di messaggio proto per il file proto, nel formatofield_name_1 field_type_1 [, field_name_2 field_type_2, ...].Devi tradurre tutti i campi dei tipi di messaggi che utilizzano i trattini bassi per utilizzare invece la notazione a cammello. Ad esempio, se il tipo di messaggio è simile al seguente, il valore dei campi di immissione deve essere
itemId int64, itemDescription string:message ThisMessage { int64 item_id = 1; string item_description = 2; }BUCKET_NAME: il nome del bucket Cloud Storage che contiene il filepbwrapper.js.PROTO_PACKAGE: il package per il file proto.PROTO_MESSAGE: il tipo di messaggio per il file proto.
Ad esempio, se utilizzi il file
dummy.protofornito, l'istruzioneCREATE FUNCTIONè la seguente:CREATE OR REPLACE FUNCTION mydataset.toMyProtoMessage(input STRUCT<dummyField STRING>) RETURNS BYTES LANGUAGE js OPTIONS ( library=["gs://mybucket/pbwrapper.js"] ) AS r""" let message = pbwrapper.setup("dummypackage.DummyMessage") return pbwrapper.parse(message, input) """;
Formatta le colonne come valori Protobuf
Esegui la funzione definita dall'utente toMyProtoMessage per formattare le colonne della tabella BigQuery come valori Protobuf:
SELECT
UDF_DATASET_ID.toMyProtoMessage(STRUCT(INPUT_COLUMNS)) AS protoResult
FROM
`PROJECT_ID.DATASET_ID.TABLE_NAME`
LIMIT
100;
Sostituisci quanto segue:
UDF_DATASET_ID: l'ID del set di dati che contiene la funzione definita dall'utente.INPUT_COLUMNS: i nomi delle colonne da formattare come valore Protobuf, nel formatocolumn_name_1 [, column_name_2, ...]. Le colonne possono essere di qualsiasi tipo di valore scalare o non scalare supportato, inclusiARRAYeSTRUCT. Le colonne di input devono corrispondere al tipo e al numero dei campi del tipo di messaggio proto.PROJECT_ID: l'ID del progetto che contiene la tabella. Puoi saltare l'identificazione del progetto se il set di dati si trova nel progetto corrente.DATASET_ID: l'ID del set di dati che contiene la tabella.TABLE_NAME: il nome della tabella che contiene le colonne da formattare.
Ad esempio, se utilizzi una funzione definita dall'utente toMyProtoMessage basata su dummy.proto,
la seguente istruzione SELECT funziona:
SELECT
mydataset.toMyProtoMessage(STRUCT(word)) AS protoResult
FROM
`bigquery-public-data.samples.shakespeare`
LIMIT 100;
Utilizza i valori Protobuf
Con i dati BigQuery esportati nel formato Protobuf, ora puoi lavorare con i dati come oggetto o struct completamente tipizzato.
I seguenti esempi di codice mostrano diversi modi per elaborare o utilizzare i dati esportati: