Consultas de vistas materializadas continuas

Para crear una vista materializada continua de una tabla de Bigtable, ejecuta una consulta de SQL que defina la vista materializada continua.

En este documento se describen conceptos y patrones que le ayudarán a preparar su consulta de SQL de vista materializada continua. Antes de leer este documento, debes familiarizarte con las vistas materializadas continuas y con GoogleSQL para Bigtable.

Las vistas materializadas continuas usan una sintaxis de SQL restringida. En el siguiente patrón se muestra cómo crear una consulta de SQL de una vista materializada continua:

SELECT
  expression AS alias [, ...]
FROM from_item
[ WHERE bool_expression ]
GROUP BY expression [, ...];

from_item:
    {
      table_name [ as_alias ]
      | field_path
      }

as_alias:
    [ AS ] alias

Si quieres crear una consulta de SQL de una vista materializada continua como índice secundario asíncrono, usa la cláusula ORDER BY:

SELECT
  expression AS alias [, ...]
FROM from_item
[ WHERE bool_expression ]
ORDER BY expression [, ...];

from_item:
    {
      table_name [ as_alias ]
      | field_path
      }

as_alias:
    [ AS ] alias

Limitaciones de las consultas

Se aplican las siguientes reglas a las consultas de SQL que se usan para crear vistas materializadas continuas:

  • Debe ser una instrucción SELECT.
  • Debe tener una cláusula GROUP BY o, en el caso de las consultas de índice secundario asíncronas, una cláusula ORDER BY, pero no ambas.
  • Solo se pueden usar funciones de agregación admitidas.
  • Puede tener varias agregaciones por grupo.

Agregaciones admitidas

Puedes usar las siguientes funciones de agregación en una consulta SQL que defina una vista materializada continua:

  • COUNT
  • SUM
  • MIN
  • MAX
  • HLL_COUNT.INIT
  • HLL_COUNT.MERGE
  • HLL_COUNT.MERGE_PARTIAL
  • ANY_VALUE
  • BIT_AND
  • BIT_OR
  • BIT_XOR
  • AVG

Si SELECT COUNT(*), debes definir una clave de fila, como en el siguiente ejemplo:

SELECT
  '*' AS _key,
  COUNT(*) AS count
FROM
  foo
GROUP BY
  _key;

Funciones de SQL no admitidas

No puedes usar las siguientes funciones de SQL:

  • Cualquier función que no sea compatible con GoogleSQL para Bigtable
  • ARRAY
  • ARRAY_AGG
  • ARRAY_CONCAT_AGG
  • COUNT_IF
  • CURRENT_TIME y otras funciones no deterministas
  • DATE y DATETIME como columnas de salida (usa TIMESTAMP o almacena una cadena).
  • DESC en el resultado
  • DISTINCT, como en SUM(*DISTINCT* value))
  • LIMIT/OFFSET
  • SELECT *
  • Cláusula OVER para crear una agregación de ventana
  • STRUCT

Tampoco puedes anidar cláusulas GROUP BY o ORDER BY ni crear columnas de mapa. Para ver otras limitaciones, consulta Limitaciones.

Evitar filas excluidas

Las filas de entrada se excluyen de una vista materializada continua en los siguientes casos:

  • Se han seleccionado más de 1 MiB de datos de la fila. Por ejemplo, si tu consulta es SELECT apple AS apples , SUM(banana) AS sum_bananas FROM my_table GROUP BY apples, se excluirá de la vista materializada continua cualquier fila que contenga más de 1 MiB de datos en las columnas apple y banana.
  • Se han generado más de 1 MiB de datos a partir de la fila. Esto puede ocurrir cuando usas consultas como SELECT REPEAT(apple, 1000) o constantes grandes.
  • Se genera más de 10 veces más datos de los que se han seleccionado.
  • La consulta no coincide con tus datos. Esto incluye intentar dividir un cero, un desbordamiento de enteros o esperar un formato de clave de fila que no se utilice en todas las claves de fila.

Las filas excluidas incrementan la métrica de errores de usuario cuando se procesan por primera vez. Para obtener más información sobre las métricas que pueden ayudarte a monitorizar tus vistas materializadas continuas, consulta Métricas.

Detalles de la consulta

En esta sección se describe una consulta de vista materializada continua y cómo podrían ser los resultados cuando se consulte la vista. Los datos de la tabla de origen son la entrada, y los datos de resultados de la vista materializada continua son la salida. Los datos de salida se agregan o no (en la clave definida).

Instrucción SELECT

La instrucción de selección configura las columnas y las agregaciones que se utilizan en la vista materializada continua. La instrucción debe usar una cláusula GROUP BY para agregar filas o una cláusula ORDER BY para crear un índice secundario asíncrono.

SELECT * no es compatible, pero SELECT COUNT(*) sí.

Al igual que en una instrucción SELECT típica, puedes tener varias agregaciones por conjunto de datos agrupados. Las columnas sin agrupar deben ser un resultado de agregación.

Este es un ejemplo de una consulta de agregación GROUP BY estándar en SQL:

SELECT
  myfamily["node"] AS node,
  myfamily["type"] AS type,
  COUNT(clicks) AS clicks_per_key
FROM
  mytable
GROUP BY
  node,
  type

Claves de fila y datos no agregados

Puedes especificar un _key como clave de fila de una vista materializada continua. Si no lo haces, las columnas de la cláusula GROUP BY formarán la clave de la vista.

Claves de fila definidas por una columna _key

Cuando definas tu vista materializada continua, puedes especificar una columna _key. (Es diferente de la _keycolumna que se obtiene al ejecutar una consulta de SQL en una tabla de Bigtable). Si especificas un _key, se aplican las siguientes reglas:

  • Debes agrupar por _key y no puedes agrupar por ningún otro elemento, excepto (opcionalmente) por _timestamp. Para obtener más información, consulta Marcas de tiempo.
  • La columna _key debe ser de tipo BYTES.

Especificar un _key es útil si tienes previsto leer la vista con ReadRows en lugar de con SQL, ya que te permite controlar el formato de la clave de fila. Por otro lado, una consulta de SQL a una vista con un _key definido puede que necesite decodificar el _key explícitamente en lugar de devolver solo columnas de clave estructuradas.

Claves de las filas definidas por la cláusula GROUP BY o ORDER BY

Si no especifica ningún _key, las columnas sin agregar de su lista SELECT se convertirán en la clave de fila de la vista. Puedes asignar a las columnas de clave los nombres que quieras, siempre que cumplan las convenciones de SQL. Usa este método si tienes previsto usar SQL para consultar la vista en lugar de una solicitud ReadRows.

Las columnas de salida sin agregar de la lista SELECT deben incluirse en la cláusula GROUP BY. El orden en el que se escriben las columnas en la cláusula GROUP BY es el orden en el que se almacenan los datos en la clave de fila de la vista materializada continua. Por ejemplo, GROUP BY a, b, c es implícitamente ORDER BY a ASC, b ASC, c ASC.

Si usas una cláusula ORDER BY en lugar de una cláusula GROUP BY para crear un índice secundario asíncrono, las columnas de tu lista SELECT que formen parte de la cláusula ORDER BY se convertirán en la clave de fila de la vista. El orden en el que se escriben las columnas en la cláusula ORDER BY es el orden en el que se almacenan los datos en la clave de fila de la vista materializada continua. Por ejemplo, ORDER BY a, b, c almacena los datos con claves de fila ordenadas por a ASC, b ASC y c ASC.

Tu filtro SQL debe eliminar los posibles valores NULL u otros valores no válidos que puedan provocar errores. Las filas no válidas, como las que contienen una columna de clave NULL, se omiten de los resultados y se contabilizan en la métrica materialized_view/user_errors. Para depurar errores de usuario, prueba a ejecutar la consulta de SQL fuera de una vista materializada continua.

Datos agregados

Las columnas de agregación de la consulta definen los cálculos que generan los datos de la vista materializada continua.

El alias de una columna agregada se trata como un calificador de columna en la vista materializada continua.

Veamos un ejemplo:

SELECT
  fam["baz"] AS baz,
  SUM(fam["foo"]) AS sum_foo,
  SUM(fam["bar"]) AS sum_bar
FROM
  TABLE

GROUP BY
  baz;

El resultado de la consulta tiene las siguientes características:

  • La salida de cada baz se muestra en una fila independiente en el orden de baz ASC.
  • Si un baz determinado tiene al menos un foo, el sum_foo de la fila de salida será un valor no NULO.
  • Si un baz determinado tiene al menos un bar, el sum_bar de la fila de salida será un valor no NULO.
  • Si un baz determinado no tiene ningún valor en ninguna de las columnas, se omite en los resultados.

Si consultas la vista con SELECT *, el resultado será similar al siguiente:

baz sum_foo sum_bar
baz1 sum_foo1 sum_bar1
baz2 sum_foo2 sum_bar2

Marcas de tiempo

La marca de tiempo predeterminada de una celda de salida de una vista materializada continua es 0 (1970-01-01 00:00:00Z). Esto se puede ver cuando lees la vista con ReadRows, pero no cuando la consultas con SQL.

Para usar otra marca de tiempo en el resultado, puede añadir una columna de tipo TIMESTAMP a la lista SELECT de la consulta y asignarle el nombre _timestamp. Si consultas la vista materializada continua con ReadRows, _timestamp se convierte en la marca de tiempo de las demás celdas de la fila.

Una marca de tiempo no debe ser NULL, debe ser igual o superior a cero y debe ser un múltiplo de 1000 (precisión de milisegundos). Bigtable no admite marcas de tiempo de celdas anteriores al registro de tiempo de Unix (1970-01-01T00:00:00Z).

Veamos el siguiente ejemplo, que vuelve a muestrear datos agregados por día. La consulta usa la función UNPACK.

SELECT
  _key,
  TIMESTAMP_TRUNC(_timestamp, DAY) AS _timestamp,
  SUM(sum_family["sum_column"]) AS sum_column,
  SUM(sum_family["foo"]) AS second_sum_column
FROM
  UNPACK(
  SELECT
    *
  FROM
    my_table(with_history => TRUE))
GROUP BY
  1,
  2

Si un SUM determinado tiene una entrada no vacía para un día concreto, la fila de salida contiene un valor agregado con una marca de tiempo que coincide con el día truncado.

Si consultas la vista con SELECT *, el resultado será similar al siguiente:

_key _timestamp sum_column second_sum_column
1 2024-05-01 00:00:00Z 23 99
2 2024-05-02 00:00:00Z 45 201
3 2024-05-03 00:00:00Z NULL 56
4 2024-05-04 00:00:00Z 8 NULL

Codificación

Si consultas tu vista materializada continua con SQL, no tienes que saber cómo se codifican los valores agregados, ya que SQL muestra los resultados como columnas tipadas.

Si lees la vista con ReadRows, debes decodificar los datos agregados en tu solicitud de lectura. Para obtener más información sobre las solicitudes ReadRows, consulta Lecturas.

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.

Siguientes pasos