Consultas contínuas de visualizações materializadas

Para criar uma visualização materializada contínua de uma tabela do Bigtable, execute uma consulta SQL que define a visualização materializada contínua.

Este documento descreve conceitos e padrões para ajudar você a preparar sua consulta SQL de visualização materializada contínua. Antes de ler este documento, familiarize-se com as visualizações materializadas contínuas e o GoogleSQL para Bigtable.

As visualizações materializadas contínuas usam uma sintaxe SQL restrita. As consultas precisam usar o seguinte padrão:

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

Limitações de consulta

As regras a seguir se aplicam a uma consulta SQL usada para criar uma visualização materializada contínua:

  • Precisa ser uma instrução SELECT
  • Precisa ter uma cláusula GROUP BY
  • Só é possível usar funções de agregação compatíveis
  • É necessário definir pelo menos uma coluna de agregação
  • Pode ter várias agregações por grupo

Agregações com suporte

É possível usar as seguintes funções de agregação em uma consulta SQL que define uma visualização materializada contínua:

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

Se você SELECT COUNT(*), precisará definir uma chave de linha, como no exemplo abaixo:

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

Recursos do SQL incompatíveis

Não é possível usar os seguintes recursos de SQL:

  • Qualquer recurso sem suporte do GoogleSQL para Bigtable
  • ARRAY
  • ARRAY_AGG
  • ARRAY_CONCAT_AGG
  • COUNT_IF
  • CURRENT_TIME e outras funções não determinísticas
  • DATE, DATETIME como colunas de saída (use TIMESTAMP ou armazene uma string).
  • DESC classifica na saída
  • DISTINCT opção, como em SUM(*DISTINCT* value))
  • LIMIT/OFFSET
  • ORDER BY
  • SELECT *
  • Cláusula OVER para criar uma agregação de janelas
  • STRUCT

Também não é possível aninhar cláusulas GROUP BY ou criar colunas de mapa. Para mais limitações, consulte Limitações.

Evitar linhas excluídas

As linhas de entrada são excluídas de uma visualização materializada contínua nas seguintes circunstâncias:

  • Mais de 1 MiB de dados são selecionados na linha. Por exemplo, se a consulta for SELECT apple AS apples , SUM(banana) AS sum_bananas FROM my_table GROUP BY apples, qualquer linha que contenha mais de 1 MiB de dados nas colunas apple e banana será excluída da visualização materializada contínua.
  • Mais de 1 MiB de dados são gerados pela linha. Isso pode ocorrer quando você usa consultas como SELECT REPEAT(apple, 1000) ou constantes grandes.
  • Mais de 10 vezes mais dados são gerados do que foram selecionados.
  • A consulta não corresponde aos seus dados. Isso inclui tentativas de dividir um zero, overflow de número inteiro ou esperar um formato de chave de linha que não é usado em todas as chaves de linha.

As linhas excluídas incrementam a métrica de erros do usuário quando são processadas pela primeira vez. Para mais informações sobre as métricas que podem ajudar a monitorar suas visualizações materializadas contínuas, consulte Métricas.

Detalhes da consulta

Esta seção descreve uma consulta de visualização materializada contínua e como os resultados podem ficar quando a visualização é consultada. Os dados na tabela de origem são a entrada, e os dados de resultado na visualização materializada contínua são a saída. Os dados de saída são agregados ou não agregados (na chave definida).

Instrução SELECT

A cláusula de seleção configura as colunas e agregações usadas na visualização materializada contínua e precisa usar uma cláusula GROUP BY.

SELECT * não é compatível, mas SELECT COUNT(*) é.

Como em uma instrução SELECT típica, é possível ter várias agregações por um conjunto agrupado de dados. As colunas não agrupadas precisam ser um resultado de agregação.

Este é um exemplo de consulta de agregação GROUP BY padrão no SQL:

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

Chaves de linha e dados não agregados

Você pode especificar uma coluna de saída _key como quando define sua visualização materializada contínua. Isso é diferente da coluna _key que você recebe ao executar uma consulta SQL em uma tabela do Bigtable. Se você especificar um _key, as seguintes regras serão aplicadas:

  • Você precisa agrupar por _key e não pode agrupar por nada além de (opcionalmente) _timestamp. Para mais informações, consulte Carimbos de data/hora.
  • A coluna _key precisa ser do tipo BYTES.

Especificar um _key é útil se você planeja ler a visualização com ReadRows em vez de SQL, porque ele oferece controle sobre o formato da chave de linha. Por outro lado, uma consulta SQL para uma visualização com um _key definido pode precisar decodificar o _key explicitamente em vez de apenas retornar colunas de chave estruturadas.

Se você não estiver usando _key, as colunas não agregadas na instrução SELECT vão se tornar a chave na visualização materializada contínua, e você poderá atribuir às colunas-chave qualquer nome aceito pelas convenções do SQL.

Seu filtro SQL precisa eliminar possíveis NULL ou outros valores inválidos que podem causar erros. Uma linha inválida é omitida dos resultados e é contada na métrica materialized_view/user_errors. Para depurar erros do usuário, tente executar a consulta SQL fora de uma visualização materializada contínua.

As colunas de saída não agregadas precisam estar na cláusula GROUP BY. A ordem em que as colunas são gravadas na cláusula GROUP BY é a ordem em que os dados são armazenados na chave de linha da visualização materializada contínua. Por exemplo, GROUP BY a, b, c é implicitamente ORDER BY a ASC, b ASC, c ASC.

Dados agregados

As colunas agregadas na consulta definem os cálculos que geram os dados na visualização materializada contínua.

O alias de uma coluna de agregação é tratado como um qualificador de coluna na visualização materializada contínua.

Veja o exemplo a seguir.

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

A saída da consulta tem as seguintes características:

  • A saída de cada baz está em uma linha separada na ordem baz ASC.
  • Se um baz tiver pelo menos um foo, o sum_foo da linha de saída será um valor não nulo.
  • Se um baz tiver pelo menos um bar, o sum_bar da linha de saída será um valor não nulo.
  • Se um baz não tiver valor para nenhuma das colunas, ele será omitido dos resultados.

Se você consultar a visualização com SELECT *, o resultado será semelhante a este:

baz sum_foo sum_bar
baz1 sum_foo1 sum_bar1
baz2 sum_foo2 sum_bar2

Carimbos de data/hora

O carimbo de data/hora padrão de uma célula de saída em uma visualização materializada contínua é 0 (1970-01-01 00:00:00Z). Isso fica visível quando você lê a visualização com ReadRows e não quando a consulta com SQL.

Para usar um carimbo de data/hora diferente na saída, adicione uma coluna do tipo TIMESTAMP à lista SELECT da consulta e nomeie-a como _timestamp. Se você consultar a visualização materializada contínua usando ReadRows, _timestamp se tornará o carimbo de data/hora das outras células na linha.

Um carimbo de data/hora não pode ser NULL, precisa ser maior ou igual a zero e ser um múltiplo de 1.000 (precisão de milissegundos). O Bigtable não aceita carimbos de data/hora de células anteriores à época Unix (1970-01-01T00:00:00Z).

Considere o exemplo a seguir, que reamostra dados agregados por dia. A consulta usa a função 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

Se um SUM tiver uma entrada não vazia para um determinado dia, a linha de saída vai conter um valor agregado com um carimbo de data/hora que corresponde ao dia truncado.

Se você consultar a visualização com SELECT *, o resultado será semelhante a este:

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

Codificação

Se você consultar a visualização materializada contínua com SQL, não precisará saber como os valores agregados são codificados, porque o SQL expõe os resultados como colunas digitadas.

Se você ler da visualização usando ReadRows, precisará decodificar os dados agregados na solicitação de leitura. Para mais informações sobre solicitações ReadRows, consulte Leituras.

Os valores agregados em uma visualização materializada contínua são armazenados usando a codificação descrita na tabela a seguir, com base no tipo de saída da coluna da definição da visualização.

Tipo Codificação
BOOL Valor de 1 byte, 1 = verdadeiro, 0 = falso
BYTES Sem codificação
INT64 (ou INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) Big-endian de 64 bits
FLOAT64 IEEE 754 de 64 bits, excluindo NaN e +/-inf
STRING UTF-8
HORA/CARIMBO DE DATA/HORA Número inteiro de 64 bits que representa o número de microssegundos desde a Era Unix (consistente com o GoogleSQL)
Para mais informações, consulte Codificação na referência da API Data.

A seguir