Esportare i dati come colonne Protobuf
Questo documento descrive come esportare i dati 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 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à, 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 completamente tipizzato, il che può ridurre la quantità di lavoro da svolgere nel livello applicazione o in un'altra parte della pipeline.
Tuttavia, esistono limitazioni all'esportazione dei dati BigQuery come colonne Protobuf:
- Le colonne Protobuf non sono ben indicizzate o filtrate. La ricerca in base al contenuto delle colonne Protobuf può essere meno efficace.
- Ordinare i 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 BigQuery:
- Utilizza le query pianificate con le istruzioni
EXPORT DATA
per ordinare i dati 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 BigQuery in formato 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:
-
Crea una funzione definita dall'utente;utente:
Editor dati BigQuery (
roles/bigquery.dataEditor
) -
Esporta i dati da una tabella BigQuery:
Visualizzatore dati BigQuery (
roles/bigquery.dataViewer
) -
Leggi e carica 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.
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.git
Vai alla cartella di esportazione di Protobuf:
cd bigquery-utils/tools/protobuf_export
Utilizza il comando
cp
o il browser di file del 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 install
Raggruppa il pacchetto utilizzando webpack:
npx webpack --config webpack.config.js --stats-error-details
Individua il file
pbwrapper.js
nella cartella secondaria./dist
, quindi carica il file in un bucket Cloud Storage.Vai alla pagina BigQuery.
Utilizzando l'editor di query, crea una UDF denominata
toMyProtoMessage
che 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 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.proto
fornito, l'istruzioneCREATE FUNCTION
ha il seguente aspetto: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 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 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 di tipo non scalare, inclusiARRAY
eSTRUCT
. 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 attuale.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 BigQuery esportati in formato Protobuf, ora puoi utilizzarli come oggetto o struct completamente tipizzato.
I seguenti esempi di codice forniscono diversi modi per elaborare o utilizzare i dati esportati: