Esportare i dati come colonne Protobuf
Questo documento descrive come esportare i dati di BigQuery come colonne Protocol Buffers (Protobuf) utilizzando le funzioni definite dall'utente (UDF) di BigQuery.
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 singolo valore Protobuf, che presenta i seguenti vantaggi:
- Sicurezza del tipo di oggetto.
- Miglioramento della compressione, del tempo di trasferimento dei dati e dei costi rispetto a JSON.
- Flessibilità, in quanto la maggior parte dei linguaggi di programmazione dispone di librerie per la gestione di Protobuf.
- Minore 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 con tipo completo, che può ridurre la quantità di lavoro da eseguire sul livello dell'applicazione o su un'altra parte della pipeline.
Tuttavia, l'esportazione dei dati di BigQuery come colonne Protobuf presenta delle limitazioni:
- Le colonne Protobuf non sono ben indicizzate o filtrate. La ricerca in base al contenuto delle colonne Protobuf può essere meno efficace.
- L'ordinamento dei dati in formato Protobuf può essere difficile.
Se queste limitazioni si applicano al flusso di lavoro di esportazione, puoi prendere in considerazione altri metodi di esportazione dei dati di BigQuery:
- Utilizza le query pianificate con
EXPORT DATAistruzioni per ordinare i dati di BigQuery esportati per data o 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 in formato di file Avro o CSV.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per esportare i dati di BigQuery come colonne Protobuf, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
Crea una funzione definita dall'utente:
Editor dati BigQuery (
roles/bigquery.dataEditor) -
Esporta i dati da una tabella BigQuery:
Visualizzatore dati BigQuery (
roles/bigquery.dataViewer) -
Leggi e carica i file in Cloud Storage:
Creatore oggetti Storage (
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.
Creare una UDF
Crea una UDF che converta un tipo di dati STRUCT di 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 Protobuf:
cd bigquery-utils/tools/protobuf_exportUtilizza il comando
cpo il browser di file del sistema operativo per copiare il file proto nella./protossottocartella.Nella cartella
./protosè già presente un file proto di esempio denominatodummy.proto.Installa i pacchetti necessari dal repository GitHub:
npm installRaggruppa il pacchetto utilizzando webpack:
npx webpack --config webpack.config.js --stats-error-detailsIndividua il file
pbwrapper.jsnella sottocartella./dist, quindi carica il file in un bucket Cloud Storage.Vai alla pagina BigQuery.
Utilizzando l'editor di query, crea una UDF denominata
toMyProtoMessageche crea 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 deve contenere la UDF.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 del tipo di messaggio che utilizzano i trattini bassi in modo che utilizzino invece il formato camel case. Ad esempio, se il tipo di messaggio è simile al seguente, il valore dei campi di input 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 pacchetto 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) """;
Formattare le colonne come valori Protobuf
Esegui la UDF 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 UDF.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 di 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 UDF 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;
Utilizzare i valori Protobuf
Con i dati di BigQuery esportati in formato Protobuf, ora puoi utilizzarli come oggetto o struct con tipo completo.
I seguenti esempi di codice forniscono diversi esempi di modi in cui puoi elaborare o utilizzare i dati esportati: