Aplicación de tipos de datos en Bigtable

El esquema flexible de Bigtable te permite almacenar datos de cualquier tipo, como cadenas, fechas, números, documentos JSON o incluso imágenes o archivos PDF, en una tabla de Bigtable.

En este documento, se describe cuándo Bigtable aplica el tipo, lo que requiere que lo codifiques o decodifiques en el código de la aplicación. Para obtener una lista de los tipos de datos de Bigtable, consulta Tipo en la documentación de referencia de la API de datos.

Tipos aplicados

Se aplica el tipo de datos para los siguientes datos:

  • Familias de columnas de agregación (contadores)
  • Marcas de tiempo
  • Vistas materializadas continuas
  • Claves de fila estructuradas

Agregaciones

Para el tipo de datos agregados, la codificación depende del tipo de agregación. Cuando creas una familia de columnas agregadas, debes especificar un tipo de agregación.

En esta tabla, se muestra el tipo de entrada y la codificación para cada tipo de agregación.

Tipo de agregación Tipo de entrada Codificación
Suma Int64 BigEndianBytes
Mín. Int64 BigEndianBytes
Máx. Int64 BigEndianBytes
HLL Bytes Zetasketch HLL++

Cuando consultas los datos en celdas de agregación con SQL, este incorpora automáticamente la información de tipo.

Cuando lees los datos de las celdas de agregación con el método ReadRows de la API de datos, Bigtable devuelve bytes, por lo que tu aplicación debe decodificar los valores con la codificación que Bigtable usó para asignar los datos con tipo a bytes.

No puedes convertir una familia de columnas que contenga datos no agregados en una familia de columnas agregadas. Las columnas de las familias de columnas agregadas no pueden contener celdas no agregadas, y las familias de columnas estándar no pueden contener celdas agregadas.

Para obtener más información sobre cómo crear tablas con familias de columnas agregadas, consulta Crea una tabla. Para ver muestras de código en las que se indica cómo incrementar una celda de agregación con valores codificados, consulta Incrementa un valor.

Marcas de tiempo

Cada celda de Bigtable tiene una marca de tiempo Int64 que representa la cantidad de microsegundos desde el tiempo Unix, 1970-01-01 00:00:00 UTC.

Origen de la marca de tiempo

Cada marca de tiempo de una tabla de Bigtable tiene un origen que indica cómo se estableció. Bigtable reconoce los siguientes orígenes de marcas de tiempo:

  • Especificadas por el usuario: Son las marcas de tiempo que estableces tú o una aplicación.
  • Generadas por Bigtable: Son marcas de tiempo que establece la biblioteca cliente que usa el reloj del sistema local del cliente o que genera el servidor y que usan la hora actual del servidor.

Nivel de detalle y precisión de la marca de tiempo

Bigtable admite los siguientes niveles de nivel de detalle de marca de tiempo:

  • Granularidad de milisegundos (predeterminada): La marca de tiempo debe ser un valor de microsegundos con una precisión de milisegundos como máximo, como 3023483279876000. Bigtable rechaza las marcas de tiempo especificadas por el usuario con precisión de microsegundos y trunca las marcas de tiempo generadas por Bigtable con precisión de microsegundos a precisión de milisegundos.
  • Nivel de detalle de microsegundos: La marca de tiempo puede tener una precisión completa de microsegundos, como 3023483279876543. Bigtable acepta marcas de tiempo especificadas por el usuario y generadas por Bigtable con precisión de microsegundos.

Debes establecer el nivel de detalle de la marca de tiempo cuando creas una tabla.

Limitaciones de las marcas de tiempo

Las siguientes limitaciones se aplican a las tablas con un nivel de detalle de marca de tiempo de microsegundos:

  • Solo la biblioteca cliente de Bigtable para Java, versión 2.82.0 o posterior, admite el nivel de detalle de la marca de tiempo en microsegundos. Las solicitudes de lectura o escritura que usan otro cliente fallan.
  • El nivel de detalle de la marca de tiempo de microsegundos solo está disponible para las instancias de la edición Enterprise Plus.
  • No puedes cambiar el nivel de detalle de la marca de tiempo de una tabla después de crearla.
  • No puedes crear vistas materializadas continuas en tablas con nivel de detalle de microsegundos.
  • No puedes crear vistas lógicas en tablas con nivel de detalle de microsegundos.
  • No puedes cambiar una instancia de Enterprise Plus a Enterprise si contiene tablas con un nivel de detalle de microsegundos. Debes borrar estas tablas antes de iniciar una versión anterior.
  • Las copias de seguridad de las tablas con un nivel de detalle de microsegundos solo se pueden restablecer en instancias de Enterprise Plus.

Vistas materializadas continuas

Las vistas materializadas continuas son recursos de solo lectura que puedes leer con SQL o con una llamada a la API de datos de ReadRows. Los datos de una vista materializada se escriben en función de la consulta que los define. Para obtener una descripción general, consulta Vistas materializadas continuas.

Cuando usas SQL para consultar una vista materializada continua, SQL incorpora automáticamente la información de tipo.

Cuando lees desde una vista materializada continua con una solicitud de la API de datos ReadRows, debes conocer el tipo de cada columna y decodificarlo en el código de la aplicación.

Los valores agregados en una vista materializada continua se almacenan con la codificación que se describe en la siguiente tabla, según el tipo de resultado de la columna de la definición de la vista.

Tipo Codificación
BOOL Valor de 1 byte, 1 = verdadero, 0 = falso
BYTES Sin codificación
INT64 (o INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) Big-endian de 64 bits
FLOAT64 IEEE 754 de 64 bits, sin NaN ni +/-inf
STRING UTF-8
TIME/TIMESTAMP Es un número entero de 64 bits que representa la cantidad de microsegundos desde el tiempo Unix (coherente con GoogleSQL).
Para obtener más información, consulta Codificación en la referencia de la API de datos.

Claves de fila estructuradas

Las claves de fila estructuradas te permiten acceder a tus datos con claves de varias columnas, similares a las claves compuestas en las bases de datos relacionales.

El tipo y la codificación de las claves de fila estructuradas se definen mediante un esquema de clave de fila que puedes agregar de forma opcional a una tabla de Bigtable. Los datos estructurados de la clave de fila se almacenan como bytes, pero GoogleSQL para Bigtable usa automáticamente el tipo y la codificación definidos en el esquema de la clave de fila cuando ejecutas una consulta en SQL en la tabla.

No se admite el uso de un esquema de clave de fila para consultar una tabla con una solicitud ReadRows. Una vista materializada continua tiene un esquema de clave de fila de forma predeterminada. Para obtener más información sobre las claves de fila estructuradas, consulta Administra clave de fila fila.

Tipos no aplicados

Si no se proporciona información de tipo, Bigtable trata cada celda como bytes con una codificación desconocida.

Cuando consultes familias de columnas que se crearon sin aplicación de tipos, debes proporcionar información de tipo en el momento de la lectura para asegurarte de que los datos se lean correctamente. Esto es relevante para las funciones de la base de datos cuyo comportamiento depende del tipo de datos. GoogleSQL para Bigtable ofrece funciones CAST para realizar conversiones de tipos en el momento de la consulta. Estas funciones convierten de bytes a los tipos que esperan varias funciones.

Si bien Bigtable no aplica tipos, algunas operaciones suponen un tipo de datos. Saber esto te ayuda a garantizar que tus datos se escriban de una manera que se pueda procesar dentro de la base de datos. A continuación, se incluyen ejemplos:

  • Los incrementos que usan ReadModifyWriteRow suponen que la celda contiene un número entero con signo big-endian de 64 bits.
  • La función TO_VECTOR64 en SQL espera que la celda contenga un array de bytes que sea una concatenación de los bytes big-endian de números de punto flotante de 64 bits.
  • La función TO_VECTOR32 en SQL espera que la celda contenga un array de bytes que sea una concatenación de los bytes big-endian de números de punto flotante de 32 bits.

¿Qué sigue?