Exporta datos como columnas de Protobuf
En este documento, se describe cómo puedes exportar datos de BigQuery como columnas de búferes de protocolo (Protobuf) mediante funciones definidas por el usuario (UDF) de BigQuery.
Cuándo usar columnas de Protobuf
BigQuery ofrece una variedad de funciones integradas para dar formato a los datos seleccionados. Una opción es combinar varios valores de columna en un solo valor de Protobuf, lo que brinda los siguientes beneficios:
- Seguridad de tipo de objeto
- Compresión mejorada, tiempo de transferencia de datos y costo en comparación con JSON
- Flexibilidad, ya que la mayoría de los lenguajes de programación tienen bibliotecas para manejar Protobuf
- Menos sobrecarga cuando se lee desde varias columnas y se compila un solo objeto
Si bien otros tipos de columna también pueden proporcionar seguridad de tipo, el uso de columnas de Protobuf proporciona un objeto de tipo completo, lo que puede reducir la cantidad de trabajo que se debe realizar en la capa de la aplicación o en otra parte de la canalización.
Sin embargo, existen limitaciones para exportar datos de BigQuery como columnas de Protobuf:
- Las columnas de Protobuf no están bien indexadas ni filtradas. La búsqueda mediante el contenido de las columnas de Protobuf puede ser menos eficaz.
- Ordenar datos en formato Protobuf puede ser difícil.
Si estas limitaciones se aplican al flujo de trabajo de exportación, puedes considerar otros métodos para exportar datos de BigQuery:
- Usa las consultas programadas con
sentencias
EXPORT DATA
para ordenar los datos exportados de BigQuery por fecha o hora, y programar las exportaciones de forma recurrente. BigQuery es compatible con la exportación de datos a los formatos Avro, CSV, JSON y Parquet. - Usa Dataflow para exportar datos de BigQuery en formato de archivo Avro o CSV.
Roles obligatorios
Para obtener los permisos que necesitas para exportar los datos de BigQuery como columnas de Protobuf, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:
-
Crea una función definida por el usuario:
Editor de datos de BigQuery (
roles/bigquery.dataEditor
) - Exportar datos desde una tabla de BigQuery: Visualizador de datos de BigQuery (
roles/bigquery.dataViewer
) -
Lee y sube archivos a Cloud Storage:
Creador de objetos de almacenamiento (
roles/storage.objectCreator
)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.
Crea una UDF
Crea una UDF que convierta un tipo de datos STRUCT
de BigQuery
en una columna de Protobuf:
En una línea de comandos, clona el repositorio
bigquery-utils.git
.git clone https://github.com/GoogleCloudPlatform/bigquery-utils.git
Navega a la carpeta de exportación de Protobuf:
cd bigquery-utils/tools/protobuf_export
Usa el comando
cp
o el navegador de archivos de tu sistema operativo para copiar el archivo proto a la carpeta secundaria./protos
.Ya hay un archivo proto de muestra llamado
dummy.proto
en la carpeta./protos
.Instala los paquetes necesarios desde el repositorio de GitHub:
npm install
Empaqueta el paquete mediante webpack:
npx webpack --config webpack.config.js --stats-error-details
Busca el archivo
pbwrapper.js
en la carpeta secundaria./dist
y, luego, súbelo a un bucket de Cloud Storage.Ve a la página de BigQuery.
Con el editor de consultas, crea una UDF llamada
toMyProtoMessage
que compile una columna Protobuf a partir de las columnas de la tabla de BigQuery existentes: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) """;
Reemplaza lo siguiente:
DATASET_ID
: El ID del conjunto de datos que contendrá la UDF.INPUT_FIELDS
: Son los campos que se usan en el tipo de mensaje de proto para el archivo proto, en el formatofield_name_1 field_type_1 [, field_name_2 field_type_2, ...]
.Debes traducir todos los campos de tipo de mensaje que usen guiones bajos para usar mayúsculas y minúsculas en su lugar. Por ejemplo, si el tipo de mensaje se ve de la siguiente manera, el valor de los campos de entrada debe ser
itemId int64, itemDescription string
:message ThisMessage { int64 item_id = 1; string item_description = 2; }
BUCKET_NAME
: Es el nombre del bucket de Cloud Storage que contiene el archivopbwrapper.js
.PROTO_PACKAGE
: Es el paquete del archivo proto.PROTO_MESSAGE
: Es el tipo de mensaje del archivo proto.
Por ejemplo, si usas el archivo
dummy.proto
proporcionado, la sentenciaCREATE FUNCTION
se verá de la siguiente manera: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) """;
Dales formato a las columnas como valores de Protobuf
Ejecuta la UDF toMyProtoMessage
para dar formato a las columnas de la tabla de BigQuery
como valores de Protobuf:
SELECT
UDF_DATASET_ID.toMyProtoMessage(STRUCT(INPUT_COLUMNS)) AS protoResult
FROM
`PROJECT_ID.DATASET_ID.TABLE_NAME`
LIMIT
100;
Reemplaza lo siguiente:
UDF_DATASET_ID
: El ID del conjunto de datos que contiene la UDF.INPUT_COLUMNS
: Los nombres de las columnas que se formatearán como un valor de Protobuf, en el formatocolumn_name_1 [, column_name_2, ...]
. Las columnas pueden ser de cualquier tipo de valor escalar o no escalar compatible, incluidosARRAY
ySTRUCT
. Las columnas de entrada deben coincidir con el tipo y la cantidad de campos de tipo de mensaje de proto.PROJECT_ID
: el ID del proyecto que contiene la tabla. Puedes omitir la identificación del proyecto si el conjunto de datos está en tu proyecto actual.DATASET_ID
: Es el ID del conjunto de datos que contiene la tabla.TABLE_NAME
: Es el nombre de la tabla que contiene las columnas que se van a dar formato.
Por ejemplo, si usas una UDF toMyProtoMessage
basada en dummy.proto
,
funciona la siguiente sentencia SELECT
:
SELECT
mydataset.toMyProtoMessage(STRUCT(word)) AS protoResult
FROM
`bigquery-public-data.samples.shakespeare`
LIMIT 100;
Trabaja con valores de Protobuf
Con los datos de BigQuery exportados en formato Protobuf, ahora puedes trabajar con los datos como un objeto o una struct con una definición completa de tipo.
En las siguientes muestras de código, se proporcionan varios ejemplos de formas en las que puedes procesar o trabajar con los datos exportados: