Exemplo: Usaremos um conjunto de dados fictício com o número de visualizações por hora para um grupo de nomes de domínio. Nosso objetivo
- Precisamos dos dados agregados por mês para cada nome de domínio,
- Também precisamos dos dados agregados por ano para cada nome de domínio.
- Escrever consultas que leiam e agreguem os dados durante a consulta SELECT
- Preparar os dados no momento da ingestão em um novo formato
- Preparar os dados no momento da ingestão para uma agregação específica.
Tabela de origem das visões materializadas
Null.
Você pode criar uma visão materializada sobre uma tabela Null. Assim, os dados gravados na tabela afetarão a visão, mas os dados brutos originais ainda serão descartados.
Tabela mensal agregada e visão materializada
Target. Neste exemplo, ela será analytics.monthly_aggregated_data, e armazenaremos a soma das visualizações por mês e por nome de domínio.
Tabela anual agregada e visão materializada
monthly_aggregated_data.
Primeiro, criaremos uma nova tabela de destino para armazenar a soma das visualizações agregadas por ano para cada nome de domínio.
FROM usará a tabela monthly_aggregated_data; isso significa que o fluxo de dados será:
- Os dados chegam à tabela
hourly_data. - O ClickHouse encaminhará os dados recebidos para a primeira visão materializada,
monthly_aggregated_data, - Por fim, os dados recebidos no passo 2 serão encaminhados para
year_aggregated_data.
Um equívoco comum ao trabalhar com visões materializadas é achar que os dados são lidos da tabela. Não é assim que
visão materializada funcionam; os dados encaminhados são o bloco inserido, não o resultado final da tabela.Vamos imaginar, neste exemplo, que o engine usado em monthly_aggregated_data seja um CollapsingMergeTree; os dados encaminhados para nossa segunda visão materializada, year_aggregated_data_mv, não serão o resultado final da tabela colapsada, mas sim o bloco de dados com os campos definidos como em SELECT ... GROUP BY.Se você estiver usando CollapsingMergeTree, ReplacingMergeTree ou até mesmo SummingMergeTree e planeja criar uma visão materializada em cascata, precisa entender as limitações descritas aqui.Dados de exemplo
analytics.hourly_data, verá o seguinte porque o motor de tabela é Null, mas os dados foram processados.
Resultados
sumCountViews, verá a representação binária (em alguns terminais), pois o valor não é armazenado como número, mas como um tipo AggregateFunction.
Para obter o resultado final da agregação, use o sufixo -Merge.
Você pode ver os caracteres especiais armazenados em AggregateFunction com esta consulta:
Merge para obter o valor de sumCountViews:
AggregatingMergeTree, definimos a AggregateFunction como sum, portanto podemos usar sumMerge. Quando usamos a função avg com AggregateFunction, usamos avgMerge, e assim por diante.
monthly_aggregated_data, podemos obter os dados agregados por mês de cada nome de domínio:
Combinando várias tabelas de origem em uma única tabela de destino
UNION ALL.
Primeiro, crie duas tabelas de origem que representem diferentes conjuntos de métricas:
Target com o conjunto consolidado de métricas:
Target. Não é necessário incluir explicitamente as colunas ausentes:
Target:
Target: