Suscripciones a BigQuery

En este documento, se brinda una descripción general de una suscripción a BigQuery, su flujo de trabajo y las propiedades asociadas.

Una suscripción a BigQuery es un tipo de suscripción de exportación que escribe mensajes en una tabla de BigQuery existente a medida que se reciben. No necesitas configurar un cliente suscriptor independiente. Usa la consola de Google Cloud, Google Cloud CLI, las bibliotecas cliente o la API de Pub/Sub para crear, actualizar, enumerar, desconectar o borrar una suscripción a BigQuery.

Sin el tipo de suscripción a BigQuery, necesitas una suscripción de extracción o de envío y un suscriptor (como Dataflow) que lee los mensajes y los escribe en una tabla de BigQuery. La sobrecarga de ejecutar un El trabajo de Dataflow no es necesario cuando los mensajes no requieren procesamiento adicional antes de almacenarlos en una tabla de BigQuery; puedes usar una suscripción a BigQuery.

Sin embargo, se recomienda una canalización de Dataflow para los sistemas de Pub/Sub en los que se requiere alguna transformación de datos antes de que se almacenen en una tabla de BigQuery. Para obtener información sobre cómo transmitir datos de Pub/Sub a BigQuery con transformación mediante Dataflow, consulta Transmite datos de Pub/Sub a BigQuery.

La plantilla de suscripción de Pub/Sub a BigQuery desde Dataflow aplica la entrega de exactamente una vez de forma predeterminada. Por lo general, esto se logra a través de mecanismos de deduplicación dentro de la canalización de Dataflow. Sin embargo, BigQuery la suscripción solo admite al menos una entrega. Si la anulación de duplicación exacta se fundamental para tu caso de uso, considera los procesos descendentes BigQuery para manejar posibles duplicados.

Antes de comenzar

Antes de leer este documento, asegúrate de estar familiarizado con lo siguiente:

  • Cómo funciona Pub/Sub y los diferentes términos de Pub/Sub

  • Los diferentes tipos de suscripciones que admite Pub/Sub y por qué podrías usar un suscripción a BigQuery.

  • Cómo funciona BigQuery y cómo configurarlo y administrar tablas de BigQuery.

Flujo de trabajo de suscripción a BigQuery

En la siguiente imagen, se muestra el flujo de trabajo entre una suscripción a BigQuery y BigQuery.

Flujo de mensajes para una suscripción a BigQuery
Figura 1. Flujo de trabajo de una suscripción a BigQuery

Esta es una breve descripción del flujo de trabajo que hace referencia a la Figura 1:

  1. Pub/Sub usa la función de escritura de almacenamiento de BigQuery para enviar datos a BigQuery desde una tabla de particiones.
  2. Los mensajes se envían en lotes a la tabla de BigQuery.
  3. Después de que una operación de escritura se completa correctamente, la API devuelve un OK respuesta.
  4. Si hay fallas en la operación de escritura, el mensaje de Pub/Sub se confirma de forma negativa. Luego, se vuelve a enviar el mensaje. Si el mensaje falla varias veces y se produce un tema de mensajes no entregados configurado en la suscripción, el mensaje se mueve al tema de mensajes no entregados.

Propiedades de una suscripción a BigQuery

Las propiedades que configuras para una suscripción a BigQuery determinar la tabla de BigQuery en la cual Pub/Sub escribe mensajes y el tipo de esquema de esa tabla.

Para obtener más información, consulta BigQuery propiedades.

Compatibilidad con el esquema

Esta sección solo se aplica si seleccionas la opción Usar el esquema de tema cuando creas una suscripción a BigQuery.

Pub/Sub y BigQuery usan diferentes formas de a definir sus esquemas. Los esquemas de Pub/Sub se definen en formato Apache Avro o búfer de protocolo, mientras que los esquemas de BigQuery se definen con una variedad de formatos.

A continuación, se muestra una lista de información importante sobre la compatibilidad del esquema entre un tema de Pub/Sub y una tabla de BigQuery.

  • Los mensajes que contienen un campo con un formato incorrecto no se escriben en en BigQuery.

  • En el esquema de BigQuery, INT, SMALLINT, INTEGER, BIGINT, TINYINT y BYTEINT son alias de INTEGER; DECIMAL es un alias de NUMERIC y BIGDECIMAL es un alias de BIGNUMERIC.

  • Cuando el tipo en el esquema del tema es string y el tipo en el La tabla de BigQuery es JSON, TIMESTAMP, DATETIME, DATE, TIME, NUMERIC o BIGNUMERIC, o cualquier valor para este campo de una El mensaje de Pub/Sub debe cumplir con el formato especificado para el Datos de BigQuery tipo.

  • Se admiten algunos tipos lógicos de Avro, como se especifica en la siguiente tabla. Los tipos lógicos que no se enumeran solo coinciden con el tipo Avro equivalente que annotate, como se detalla en la especificación de Avro.

A continuación, se muestra una colección de la asignación de diferentes formatos de esquema a los tipos de datos de BigQuery.

Tipos de Avro

Tipo Avro Tipo de datos de BigQuery
null Any NULLABLE
boolean BOOLEAN
int INTEGER, NUMERIC o BIGNUMERIC
long INTEGER, NUMERIC o BIGNUMERIC
float FLOAT64, NUMERIC o BIGNUMERIC
double FLOAT64, NUMERIC o BIGNUMERIC
bytes BYTES, NUMERIC o BIGNUMERIC
string STRING, JSON, TIMESTAMP, DATETIME DATE, TIME, NUMERIC o BIGNUMERIC
record RECORD/STRUCT
array de Type REPEATED Type
map con el tipo de valor ValueType REPEATED STRUCT <key STRING, value ValueType>
union con dos tipos, uno que es null y el otro Type NULLABLE Type
otros union No se puede asignar
fixed BYTES, NUMERIC o BIGNUMERIC
enum INTEGER

Tipos lógicos de Avro

Tipo lógico de Avro Tipo de datos de BigQuery
timestamp-micros TIMESTAMP
date DATE
time-micros TIME
duration INTERVAL
decimal NUMERIC o BIGNUMERIC

Tipos de búfer de protocolo

Tipo de búfer de protocolo Tipo de datos de BigQuery
double FLOAT64, NUMERIC o BIGNUMERIC
float FLOAT64, NUMERIC o BIGNUMERIC
int32 INTEGER, NUMERIC, BIGNUMERIC o DATE
int64 INTEGER, NUMERIC, BIGNUMERIC, DATE, DATETIME o TIMESTAMP
uint32 INTEGER, NUMERIC, BIGNUMERIC o DATE
uint64 NUMERIC o BIGNUMERIC
sint32 INTEGER, NUMERIC o BIGNUMERIC
sint64 INTEGER, NUMERIC, BIGNUMERIC, DATE DATETIME o TIMESTAMP
fixed32 INTEGER, NUMERIC, BIGNUMERIC o DATE
fixed64 NUMERIC o BIGNUMERIC
sfixed32 INTEGER, NUMERIC, BIGNUMERIC o DATE
sfixed64 INTEGER, NUMERIC, BIGNUMERIC, DATE DATETIME o TIMESTAMP
bool BOOLEAN
string STRING, JSON, TIMESTAMP, DATETIME, DATE, TIME, NUMERIC o BIGNUMERIC
bytes BYTES, NUMERIC o BIGNUMERIC
enum INTEGER
message RECORD/STRUCT
oneof Sin asignar
map<KeyType, ValueType> REPEATED RECORD<key KeyType, value ValueType>
enum INTEGER
repeated/array of Type REPEATED Type

Representación de números enteros de fecha y hora

Cuando se asigna un número entero a uno de los tipos de hora o fecha, el número debe representan el valor correcto. A continuación, se muestra la asignación de los tipos de datos de BigQuery al número entero que los representa.

Tipo de datos de BigQuery Representación de números enteros
DATE Es la cantidad de días transcurridos desde la época Unix, el 1 de enero de 1970.
DATETIME La fecha y hora en microsegundos expresadas como hora civil con el CivilTimeEncoder
TIME Es la hora en microsegundos expresada como hora civil con CivilTimeEncoder.
TIMESTAMP La cantidad de microsegundos desde el tiempo Unix, 1 de enero de 1970, 00:00:00 UTC

Captura de datos modificados en BigQuery

Las suscripciones a BigQuery admiten actualizaciones de captura de datos modificados (CDC) cuando use_topic_schema o use_table_schema se configuran como true en las propiedades de suscripción. Para usar la función con use_topic_schema, establece el esquema del tema con los siguientes campos:

  • _CHANGE_TYPE (obligatorio): Es un campo string configurado como UPSERT o DELETE.

    • Si un mensaje de Pub/Sub escrito en el La tabla de BigQuery tiene _CHANGE_TYPE establecido en UPSERT, BigQuery actualiza la fila con la misma clave si si existe o inserta una nueva fila si no es así.

    • Si un mensaje de Pub/Sub escrito en el La tabla de BigQuery tiene _CHANGE_TYPE establecido en DELETE, BigQuery borra la fila de la tabla que contiene el valor la misma clave si existe.

  • _CHANGE_SEQUENCE_NUMBER (opcional): Es un int64 (long) o int32 (int). configurado para garantizar que las actualizaciones y eliminaciones realizadas en el tablas de BigQuery se procesan en orden. Mensajes para la misma clave de fila debe contener un valor monótonamente creciente para _CHANGE_SEQUENCE_NUMBER. Los mensajes con números de secuencia que son menores que el número de secuencia más alto procesado para una fila no tienen ningún efecto en la fila de la tabla de BigQuery. Nota que Pub/Sub requiere un valor basado en números enteros, el valor basado en cadenas que se usa cuando se interactúa con BigQuery directamente.

Para usar la función con use_table_schema, incluye los campos anteriores en el mensaje JSON.

Permisos de la cuenta de servicio de Pub/Sub

Para crear una suscripción a BigQuery, el directorio de Pub/Sub la cuenta de servicio debe tener permiso para escribir de BigQuery y leer los metadatos de la tabla. Para obtener más información, consulta Cómo asignar roles de BigQuery a la cuenta de servicio de Pub/Sub.

Maneja los errores de los mensajes

Cuando un mensaje de Pub/Sub no se puede escribir en BigQuery, no se puede confirmar. Para reenviar esos mensajes que no se pueden entregar, configura un tema de mensajes no entregados en la suscripción de BigQuery. El mensaje de Pub/Sub reenviado al tema de mensajes no entregados contiene un atributo CloudPubSubDeadLetterSourceDeliveryErrorMessage que indica el motivo por el que el mensaje de Pub/Sub no se pudo escribir en BigQuery.

Si Pub/Sub no puede escribir mensajes en BigQuery, Pub/Sub cancela la entrega de mensajes de manera similar a comportamiento de retirada de envío. Sin embargo, si la suscripción tiene un tema de mensajes no entregados adjunto, Pub/Sub no revierte la entrega cuando las fallas de los mensajes se deben a errores de compatibilidad del esquema.

Cuotas y límites

Hay limitaciones de cuota para el suscriptor de BigQuery de procesamiento por región. Para obtener más información, consulta Cuotas de Pub/Sub. y límites.

Las suscripciones de BigQuery escriben datos con la API de BigQuery Storage Write. Para para obtener más información sobre las cuotas y los límites de la API de Storage Write, consulta API de BigQuery Storage Write solicitudes. Las suscripciones a BigQuery solo consumen la cuota de capacidad de procesamiento de la API de Storage Write. En este caso, puedes ignorar las otras consideraciones de cuota de la API de Storage Write.

Precios

Para conocer los precios de las suscripciones a BigQuery, consulta la Página de precios de Pub/Sub

¿Qué sigue?