Lecturas

En esta página se describen los tipos de solicitudes de lectura que puedes enviar a Bigtable, se analizan las implicaciones en el rendimiento y se ofrecen algunas recomendaciones para tipos específicos de consultas. Antes de leer esta página, debes familiarizarte con la descripción general de Bigtable.

Información general

Las solicitudes de lectura a Bigtable devuelven el contenido de las filas solicitadas en orden de clave, lo que significa que se devuelven en el orden en el que se almacenan. Puedes leer cualquier escritura que haya devuelto una respuesta.

Las consultas que admite tu tabla deberían ayudarte a determinar el tipo de lectura que mejor se adapte a tu caso práctico. Las solicitudes de lectura de Bigtable se dividen en dos categorías generales:

  • Leer una sola fila
  • Escaneos o lectura de varias filas

Las lecturas son atómicas a nivel de fila. Esto significa que, cuando envías una solicitud de lectura de una fila, Bigtable devuelve la fila completa o, si la solicitud falla, no devuelve nada. Nunca se devuelve una fila parcial a menos que la solicites específicamente.

Te recomendamos que uses nuestras bibliotecas de cliente de Cloud Bigtable para leer datos de una tabla en lugar de llamar a la API directamente. Hay ejemplos de código que muestran cómo enviar solicitudes de lectura en varios idiomas. Todas las solicitudes de lectura hacen la llamada a la API ReadRows.

Leer datos con el procesamiento sin servidor de Data Boost

Bigtable Data Boost te permite ejecutar consultas y tareas de lectura por lotes sin que afecte al tráfico diario de las aplicaciones. Data Boost es un servicio de computación sin servidor que puedes usar para leer tus datos de Bigtable mientras tu aplicación principal usa los nodos de tu clúster para la computación.

Data Boost es ideal para los análisis y no se recomienda para las lecturas de una sola fila. No puedes usar Aumento de datos para análisis inversos. Para obtener más información y consultar los criterios de participación, consulta la descripción general de Data Boost.

Lecturas de una sola fila

Puedes solicitar una sola fila en función de la clave de fila. Las lecturas de una sola fila, también conocidas como lecturas de punto, no son compatibles con Data Boost. Hay ejemplos de código disponibles para las siguientes variaciones:

Análisis

Las lecturas son la forma más habitual de leer datos de Bigtable. Puedes leer un intervalo de filas contiguas o varios intervalos de filas de Bigtable especificando un prefijo de clave de fila o especificando claves de fila inicial y final. Hay ejemplos de código disponibles para las siguientes variaciones:

Escaneos inversos

Las lecturas inversas te permiten leer un intervalo de filas hacia atrás especificando un prefijo de clave de fila o un intervalo de filas. El prefijo de clave de fila se usa como punto de inicio de la lectura hacia atrás. Si especificas un intervalo de filas, la clave de la fila final se utiliza como punto de inicio del análisis.

Analizar en orden inverso puede ser útil en los siguientes casos:

  • Quieres encontrar un evento (fila) y, a continuación, leer los N eventos anteriores.
  • Quieres encontrar el valor más alto antes de un valor determinado. Esto puede ser útil cuando almacenas datos de series temporales usando una marca de tiempo como sufijo de clave de fila.

Las búsquedas inversas son menos eficientes que las directas. Por lo general, diseñe las claves de fila de forma que la mayoría de los análisis sean hacia delante. Usa análisis inversos para análisis cortos, como 50 filas o menos, para mantener un tiempo de respuesta con baja latencia.

Para hacer un análisis en orden inverso, asigna el valor reversed al campo ReadRowsRequest. El valor predeterminado es "false".

Las búsquedas inversas están disponibles cuando usas las siguientes bibliotecas de cliente:

  • Biblioteca de cliente de Bigtable para C++ versión 2.18.0 o posterior
  • Biblioteca de cliente de Bigtable para Go versión 1.21.0 o posterior
  • Biblioteca de cliente de Bigtable para Java versión 2.24.1 o posterior
  • Cliente de HBase de Bigtable para Java versión 2.10.0 o posterior

Para ver ejemplos de código que muestran cómo usar las búsquedas inversas, consulta Búsqueda inversa.

Ejemplos de uso

En los siguientes ejemplos se muestra cómo se pueden usar los análisis inversos para saber cuándo cambió un cliente su contraseña por última vez y las fluctuaciones de precio de un producto en torno a un día concreto.

Cambios de contraseña

Supongamos que cada una de las claves de fila contiene un ID de cliente y una fecha con el formato 123ABC#2022-05-02, y que una de las columnas es password_reset, que almacena la hora en la que se restableció la contraseña. Bigtable almacena los datos automáticamente por orden lexicográfico, como se muestra a continuación. Tenga en cuenta que la columna no existe en las filas (días) en las que no se ha restablecido la contraseña.

`123ABC#2022-02-12,password_reset:03`
`123ABC#2022-04-02,password_reset:11`
`123ABC#2022-04-14`
`123ABC#2022-05-02`
`223ABC#2022-05-22`

Si quieres saber la última vez que el cliente 123ABC restableció su contraseña, puedes buscar en orden inverso un intervalo de 123ABC# a 123ABC#<DATE>, usando la fecha actual o una fecha futura, en todas las filas que contengan la columna password_reset con un límite de 1 fila.

Cambios de precio

En este ejemplo, las claves de fila contienen valores de producto, modelo y marca de tiempo, y una de las columnas contiene el precio del producto y el modelo en un momento determinado.

`productA#model2#1675604471,price:82.63`
`productA#model2#1676219411,price:82.97`
`productA#model2#1677681011,price:83.15`
`productA#model2#1680786011,price:83.99`
`productA#model2#1682452238,price:83.12`

Si quieres encontrar las fluctuaciones de precios en torno al precio del 14 de febrero del 2023, aunque no haya ninguna clave de fila para esa fecha en concreto en la tabla, puedes hacer un análisis hacia delante a partir de la clave de fila productA#model2#1676376000 para un número N de filas y, a continuación, hacer un análisis hacia atrás para el mismo número de filas desde la misma fila inicial. Los dos análisis te muestran los precios antes y después de la hora indicada.

Lecturas filtradas

Si solo necesita filas que contengan valores específicos o filas parciales, puede usar un filtro con su solicitud de lectura. Los filtros te permiten seleccionar los datos que quieras.

Los filtros también te permiten asegurarte de que las lecturas coincidan con las políticas de recogida de elementos no utilizados que usa tu tabla. Esto resulta especialmente útil si escribes con frecuencia celdas con marcas de tiempo en columnas ya creadas. Como la recogida de elementos no utilizados puede tardar hasta una semana en eliminar los datos caducados, usar un filtro de intervalo de marcas de tiempo para leer datos puede asegurar que no leas más datos de los que necesitas.

En la descripción general de los filtros se explica detalladamente los tipos de filtros que puede usar. En Usar filtros se muestran ejemplos en varios idiomas.

Leer datos de una vista autorizada

Para leer datos de una vista autorizada, debe usar una de las siguientes opciones:

  • CLI de gcloud
  • Cliente de Bigtable para Java

Las otras bibliotecas de cliente de Bigtable aún no admiten el acceso de vista.

Se admite cualquier método que llame al método ReadRows o SampleRowKeys de la API de datos de Bigtable. Cuando crea su cliente, debe proporcionar el ID de vista autorizado, además del ID de tabla.

Leer datos de una vista materializada continua

Puede leer datos de una vista materializada continua mediante SQL o la ReadRowsllamada a la API Data. Las vistas materializadas continuas son de solo lectura. Los datos de una vista materializada se escriben en función de la consulta que la define.

SQL

Para leer datos de una vista materializada continua mediante SQL, puedes usar el editor de consultas de Bigtable Studio o una de las bibliotecas cliente que admiten consultas SQL.

SQL expone automáticamente los resultados de las consultas como columnas tipadas, por lo que no es necesario gestionar la codificación en la consulta.

Cuando creas una vista materializada continua, Bigtable crea automáticamente un esquema de clave de fila para la tabla que define las claves de fila estructuradas de la vista. Para obtener más información sobre cómo consultar claves de fila estructuradas con SQL, consulta Consultas de claves de fila estructuradas.

API Data

Si tienes previsto leer datos de una vista materializada continua con una llamada ReadRows desde una de las bibliotecas de cliente de Bigtable, debes revisar la consulta de SQL utilizada para definir la vista. Fíjese si la vista tiene una columna _key definida, lo que se recomienda para las vistas que se van a leer con ReadRows, y si tiene una columna _timestamp.

También debe conocer el tipo de cada columna y decodificar los datos de la columna en el código de su aplicación.

Los valores agregados de una vista materializada continua se almacenan mediante la codificación que se describe en la siguiente tabla, en función del tipo de salida de la columna de la definición de la vista.

Tipo Codificación
BOOL Valor de 1 byte, 1 = true, 0 = false
BYTES Sin codificación
INT64 (o INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) Big-endian de 64 bits
FLOAT64 IEEE 754 de 64 bits, excluyendo NaN y +/-inf
STRING UTF-8
HORA/MARCA DE TIEMPO Número entero de 64 bits que representa el número de microsegundos transcurridos desde el inicio del registro de tiempo Unix (de acuerdo con GoogleSQL).
Para obtener más información, consulta Codificación en la referencia de la API Data.

Además de conocer el tipo de cada columna de la vista, debe saber la familia y el calificador de la columna. La familia de columnas predeterminada se llama default y el calificador de columna es el alias especificado en la consulta de definición. Por ejemplo, supongamos que se define una vista materializada continua con esta consulta:

SELECT
  _key,
  SUM(clicks) AS sum_clicks
FROM
  mytable
GROUP BY
  sum_clicks

Cuando consultas la vista con ReadRows, proporcionas la familia de columnas default y el calificador de columna sum_clicks.

Lecturas y rendimiento

Las lecturas que usan filtros son más lentas que las que no los usan y aumentan la utilización de la CPU. Por otro lado, pueden reducir significativamente la cantidad de ancho de banda de red que usas, ya que limitan la cantidad de datos que se devuelven. En general, los filtros se deben usar para controlar la eficiencia del rendimiento, no la latencia.

Si quieres optimizar el rendimiento de lectura, puedes usar las siguientes estrategias:

  1. Restringe el conjunto de filas lo máximo posible. Limitar el número de filas que tienen que analizar tus nodos es el primer paso para mejorar el tiempo hasta el primer byte y la latencia general de las consultas. Si no restringes el conjunto de filas, es casi seguro que Bigtable tendrá que analizar toda la tabla. Por eso, te recomendamos que diseñes tu esquema de forma que tus consultas más habituales funcionen de esta manera.

  2. Para optimizar el rendimiento después de restringir el conjunto de filas, prueba a añadir un filtro básico. Restringir el conjunto de columnas o el número de versiones devueltas no suele aumentar la latencia y, en ocasiones, puede ayudar a Bigtable a buscar de forma más eficiente los datos irrelevantes de cada fila.

  3. Si quieres optimizar aún más el rendimiento de lectura después de las dos primeras estrategias, puedes usar un filtro más complejo. Puede probar esta opción por varios motivos:

    • Sigues recibiendo muchos datos que no quieres.
    • Quieres simplificar el código de tu aplicación enviando la consulta a Bigtable.

    Sin embargo, ten en cuenta que los filtros que requieren condiciones, intercalaciones o coincidencias de expresiones regulares en valores grandes suelen ser más perjudiciales que beneficiosos si permiten que pase la mayor parte de los datos analizados. Este daño se produce en forma de un mayor uso de la CPU en tu clúster sin que se produzcan grandes ahorros del lado del cliente.

Además de estas estrategias, evita leer un gran número de claves de fila o intervalos de filas no contiguos en una sola solicitud de lectura. Cuando solicitas cientos de claves de fila o intervalos de filas en una sola solicitud, Bigtable analiza la tabla y lee las filas solicitadas de forma secuencial. Esta falta de paralelismo afecta a la latencia general y cualquier lectura que llegue a un nodo activo puede aumentar la latencia de cola. Cuantas más filas se soliciten, más tiempo tardará en completarse la lectura. Si esta latencia es inaceptable, deberías enviar varias solicitudes simultáneas que recuperen menos intervalos de filas.

Por lo general, leer más intervalos de filas en una sola solicitud optimiza el rendimiento, pero no la latencia. Leer menos intervalos de filas en varias solicitudes simultáneas optimiza la latencia, pero no el rendimiento. Encontrar el equilibrio adecuado entre la latencia y el rendimiento dependerá de los requisitos de tu aplicación. Para conseguirlo, puedes ajustar el número de solicitudes de lectura simultáneas y el número de intervalos de filas en una solicitud.

Filas grandes

Bigtable aplica los siguientes límites a las filas grandes:

  • 256 MB es el tamaño máximo de una fila. Si necesitas leer una fila que ha superado el límite, puedes paginar tu solicitud y usar un filtro cells per row limit y un filtro cells per row offset. Ten en cuenta que, si se produce una escritura en la fila entre las solicitudes de lectura paginadas, es posible que la lectura no sea atómica.

  • El tamaño máximo de una llamada a la API ReadRows es de 512 KB. Si supera el límite, Bigtable devuelve un error INVALID_ARGUMENT.

Siguientes pasos