Consultas continuas de vistas materializadas
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 para ayudarte a preparar tu consulta SQL de vista materializada continua. Antes de leer este documento, debes familiarizarte con las vistas materializadas continuas y GoogleSQL para Bigtable.
Las vistas materializadas continuas usan una sintaxis de SQL restringida. Las consultas deben usar el siguiente patrón:
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
Limitaciones de las consultas
Las siguientes reglas se aplican a una consulta de SQL que se usa para crear una vista materializada continua:
- Debe ser una sentencia
SELECT
- Debe tener una cláusula
GROUP BY
- Solo se deben usar funciones de agregación compatibles
- Debes definir al menos una columna de agregación
- Puede tener varias agregaciones por grupo
Agregaciones admitidas
Puedes usar las siguientes funciones de agregación en una consulta de SQL que define 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 usas SELECT COUNT(*)
, debes definir una clave de fila, como en el siguiente
ejemplo:
SELECT
'*' AS _key,
COUNT(*) AS count
FROM
foo
GROUP BY
_key;
Características de SQL no compatibles
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 deterministasDATE
,DATETIME
como columnas de salida (usaTIMESTAMP
o almacena una cadena)- Orden
DESC
en el resultado DISTINCT
, como enSUM(*DISTINCT* value)
).LIMIT/OFFSET
ORDER BY
SELECT *
- Cláusula
OVER
para crear una agregación de ventanas STRUCT
Tampoco puedes anidar cláusulas GROUP BY
ni crear columnas de mapa. Para conocer otras
limitaciones, consulta
Limitaciones.
Cómo evitar filas excluidas
Las filas de entrada se excluyen de una vista materializada continua en las siguientes circunstancias:
- Se seleccionaron 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
, cualquier fila que contenga más de 1 MiB de datos en las columnasapple
ybanana
se excluirá de la vista materializada continua. - La fila genera más de 1 MiB de datos. Esto puede ocurrir cuando
usas consultas como
SELECT REPEAT(apple, 1000)
o usas constantes grandes. - Se generan más de 10 veces más datos de los que se seleccionaron.
- La consulta no coincide con tus datos. Esto incluye intentar dividir un cero, desbordamiento de número entero o esperar un formato de clave de fila que no se usa en cada clave de fila.
Las filas excluidas incrementan la métrica de errores del usuario cuando se procesan por primera vez. Para obtener más información sobre las métricas que pueden ayudarte a supervisar 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 verse los resultados cuando se consulta 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).
Declaración SELECT
La cláusula SELECT configura las columnas y las agregaciones que se usan en la
vista materializada continua y debe usar una cláusula GROUP BY
.
SELECT *
no es compatible, pero SELECT COUNT(*)
sí.
Al igual que en una sentencia SELECT
típica, puedes tener varias agregaciones por un conjunto de datos agrupados. Las columnas no agrupadas 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
De manera opcional, puedes especificar una columna de salida _key
como cuando defines tu
vista materializada continua. Esto es diferente de la columna _key
que obtienes cuando ejecutas 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 (de manera opcional) por_timestamp
. Para obtener más información, consulta Marcas de tiempo. - La columna
_key
debe ser del tipoBYTES
.
Especificar un _key
es útil si planeas leer la vista con ReadRows
en lugar de con SQL, ya que te brinda control sobre el formato de la clave de fila. Por otro lado, es posible que una consulta de SQL a una vista con un _key
definido deba decodificar el _key
de forma explícita en lugar de solo mostrar columnas de claves estructuradas.
Si no usas _key
, las columnas no agregadas en tu sentencia SELECT se convierten en la clave de la vista materializada continua, y puedes asignarles cualquier nombre compatible con las convenciones de SQL.
Tu filtro de SQL debe eliminar posibles NULL
o cualquier otro valor no válido que pueda generar errores. Se omite una fila no válida de los resultados y se cuenta en la métrica materialized_view/user_errors
. Para depurar los errores del usuario, intenta ejecutar la
consulta SQL fuera de una vista materializada continua.
Las columnas de salida no agregadas deben estar 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 ORDER BY a ASC, b ASC, c ASC
de forma implícita.
Datos agregados
Las columnas agregadas en la consulta definen los cálculos que generan los datos en la vista materializada continua.
El alias de una columna agregada se trata como un calificador de columna en la vista materializada continua.
Considera el siguiente 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:
- El resultado de cada
baz
se encuentra en una fila separada en ordenbaz ASC
. - Si un
baz
determinado tiene al menos unfoo
, elsum_foo
de la fila de salida es un valor que no es NULL. - Si un
baz
determinado tiene al menos unbar
, elsum_bar
de la fila de salida es un valor que no es NULL. - Si un
baz
determinado no tiene un valor para ninguna columna, se omite de los resultados.
Luego, si consultas la vista con SELECT *
, el resultado se verá 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 para una celda de salida en una vista materializada continua es 0 (1970-01-01 00:00:00Z
). Esto se puede ver cuando lees la vista con ReadRows
y no cuando la consultas con SQL.
Para usar una marca de tiempo diferente en el resultado, puedes agregar una columna del tipo TIMESTAMP
a la lista SELECT
de la consulta y nombrarla _timestamp
.
Si consultas la vista materializada continua con ReadRows
, _timestamp
se convierte en la marca de tiempo de las otras celdas de la fila.
Una marca de tiempo no debe ser NULL
, debe ser mayor o igual que cero y debe ser un múltiplo de 1,000 (precisión de milisegundos). Bigtable no admite marcas de tiempo de celda anteriores a la época Unix (1970-01-01T00:00:00Z).
Considera el siguiente ejemplo, que vuelve a muestrear los 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 determinado, la fila de salida contendrá un valor agregado con una marca de tiempo que coincida con el día truncado.
Si consultas la vista con SELECT *
, el resultado es similar al siguiente:
_key | _timestamp | sum_column | second_sum_column |
---|---|---|---|
1 | 01-05-2024 00:00:00Z | 23 | 99 |
2 | 2024-05-02 00:00:00Z | 45 | 201 |
3 | 2024-05-03 00:00:00Z | NULL | 56 |
4 | 04-05-2024 00:00:00Z | 8 | NULL |
Codificación
Si consultas tu vista materializada continua con SQL, no necesitas saber cómo se codifican los valores agregados, ya que SQL expone los resultados como columnas escritas.
Si lees desde 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 en una vista materializada continua se almacenan con la codificación que se describe en la siguiente tabla, según el tipo de salida 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 la época de Unix (consistente con GoogleSQL). |
¿Qué sigue?
- Crea y administra vistas materializadas continuas
- Documentación de referencia de GoogleSQL para Bigtable