Exportar dados como colunas Protobuf
Neste documento, descrevemos como exportar dados do BigQuery como colunas de buffers de protocolo (Protobuf) usando funções definidas pelo usuário (UDFs, na sigla em inglês) do BigQuery.
Quando usar as colunas do Protobuf
O BigQuery oferece várias funções integradas para formatar os dados selecionados. Uma opção é mesclar vários valores de coluna em um único valor de Protobuf, o que tem os seguintes benefícios:
- Segurança de tipo de objeto
- Compactação, tempo de transferência de dados e custo aprimorados em comparação com o JSON.
- Flexibilidade, já que a maioria das linguagens de programação tem bibliotecas para lidar com Protobuf.
- Menos sobrecarga ao ler de várias colunas e criar um único objeto.
Enquanto outros tipos de coluna também podem fornecer segurança de tipo, o uso de colunas Protobuf fornece um objeto totalmente tipado, o que pode reduzir a quantidade de trabalho que precisa ser feita na camada do aplicativo ou em outra parte do pipeline.
No entanto, há limitações para exportar dados do BigQuery como colunas Protobuf:
- As colunas protobuf não são bem indexadas ou filtradas. Pesquisar pelo conteúdo das colunas do Protobuf pode ser menos eficaz.
- Classificar dados no formato Protobuf pode ser difícil.
Se essas limitações se aplicarem ao seu fluxo de trabalho de exportação, considere outros métodos de exportação de dados do BigQuery:
- Use o Dataflow para exportar dados do BigQuery nos formatos de arquivo Avro ou CSV.
- Use consultas programadas para classificar os dados exportados do BigQuery por data ou hora e programar exportações de maneira recorrente.
Funções exigidas
Para conseguir as permissões necessárias para exportar dados do BigQuery como colunas do Protobuf, peça ao seu administrador para conceder a você os seguintes papéis do IAM no seu projeto:
- Crie uma função definida pelo usuário:
Editor de dados do BigQuery (
roles/bigquery.dataEditor
) -
Exporte dados de uma tabela do BigQuery:
Leitor de dados do BigQuery (
roles/bigquery.dataViewer
) - Leia e faça upload de arquivos para o Cloud Storage:
Criador de objetos do Storage (
roles/storage.objectCreator
)
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.
Criar uma UDF
O procedimento a seguir mostra como criar uma função definida pelo usuário que converte um tipo de dados STRUCT
do BigQuery em uma coluna Protobuf:
Em uma linha de comando, clone o repositório
bigquery-utils.git
:$ git clone https://github.com/GoogleCloudPlatform/bigquery-utils.git
Navegue até a pasta de exportação do Protobuf.
$ cd bigquery-utils/tools/protobuf_export
Adicione seus arquivos proto à pasta
./protos
.Instale os pacotes necessários no repositório do GitHub:
$ npm install
Agrupe o pacote usando o webpack:
$ npx webpack --config webpack.config.js --stats-error-details
Localize o arquivo
pbwrapper.js
na pastadist/
e copie-o para um bucket do Cloud Storage.Crie uma UDF que crie uma coluna Protobuf com base nas colunas atuais do BigQuery:
CREATE FUNCTION DATASET_ID.toMyProtoMessage(input STRUCT<field_1 TYPE1, field_2 TYPE2>) 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) """;
Substitua:
DATASET_ID
: o ID do conjunto de dados em que você armazena sua funçãoBUCKET_NAME
: o nome do bucket do Cloud StoragePROTO_PACKAGE
: o nome do pacote do arquivo proto.PROTO_MESSAGE
: o tipo de mensagem do arquivo proto.
Para saber mais sobre como usar pacotes na linguagem proto, consulte Pacotes.
Formatar colunas como valores Protobuf
Depois de criar a UDF, execute a função:
SELECT DATASET_ID.toMyProtoMessage(STRUCT(COLUMN_TYPE1, COLUMN_TYPE2)) AS protoResult FROM `DATASET_NAME` LIMIT 100;
Substitua:
DATASET_ID
: o ID do conjunto de dados em que você armazena sua funçãoDATASET_NAME
: o nome do conjunto de dados, por exemplo,dataset_name.table_name
COLUMN_TYPE1
: o nome de uma coluna. As colunas podem incluir qualquer tipo de valor escalar ou não escalar compatível, incluindoARRAY
eSTRUCT
.COLUMN_TYPE2
: o nome de uma coluna. As colunas podem incluir qualquer tipo de valor escalar ou não escalar compatível, incluindoARRAY
eSTRUCT
.
Trabalhar com valores Protobuf
Com os dados do BigQuery exportados no formato Protobuf, agora é possível trabalhar com seus dados como um objeto ou estrutura totalmente tipado.
Os exemplos de código a seguir fornecem vários exemplos de maneiras de processar ou trabalhar com os dados exportados: