O GoogleSQL para BigQuery suporta esboços de dados. Um esboço de dados é um resumo compacto de uma agregação de dados. Ele captura todas as informações necessárias para extrair um resultado de agregação, continuar uma agregação de dados ou mesclá-la com outro esboço, permitindo uma nova agregação.
Calcular uma métrica usando um esboço é muito mais barato do que calcular um valor exato. Se a computação for muito lenta ou precisar de muito armazenamento temporário, use esboços para reduzir o tempo e os recursos de consulta.
Além disso, a computação de cardinalidades, como o número de usuários distintos, ou de quantis, como a duração média da visita, sem esboços geralmente só é possível ao executar jobs nos dados brutos, porque os dados já agregados não podem ser mais combinados.
Considere uma tabela com os seguintes dados:
Produto | Número de usuários | Duração média da visita |
---|---|---|
Produto A | 500 milhões | 10 minutos |
Produto B | 20 milhões | 2 minutos |
Não é possível calcular o número total de usuários dos dois produtos porque não sabemos quantos usuários usaram ambos os produtos na tabela. Da mesma forma, não é possível calcular a duração média da visita porque a distribuição das durações das visitas foi perdida.
Uma solução é armazenar sketches na tabela. Cada esboço é uma representação aproximada e compacta de uma propriedade de entrada específica, como a cardinalidade, que pode ser armazenada, mesclada (ou reagregada) e consultada para resultados quase exatos. No exemplo anterior, é possível estimar o número de usuários distintos para os produtos A e B criando e mesclando (reagregando) os esboços de cada produto. Você também pode estimar a duração média da visita com esboços de quantis que também podem ser combinados e consultados.
Por exemplo, a consulta a seguir usa esboços HLL++ e KLL para estimar usuários distintos e a duração média da visita no YouTube (produto A) e no Google Maps (produto B):
-- Build sketches for YouTube stats. CREATE TABLE user.YOUTUBE_ACCESS_STATS AS SELECT HLL_COUNT.INIT(user_id) AS distinct_users_sketch, KLL_QUANTILES.INIT_INT64(visit_duration_ms) AS visit_duration_ms_sketch, hour_of_day FROM YOUTUBE_ACCESS_LOG() GROUP BY hour_of_day; -- Build sketches for Maps stats. CREATE TABLE user.MAPS_ACCESS_STATS AS SELECT HLL_COUNT.INIT(user_id) AS distinct_users_sketch, KLL_QUANTILES.INIT_INT64(visit_duration_ms) AS visit_duration_ms_sketch, hour_of_day FROM MAPS_ACCESS_LOG() GROUP BY hour_of_day; -- Query YouTube hourly stats. SELECT HLL_COUNT.EXTRACT(distinct_users_sketch) AS distinct_users, KLL_QUANTILES.EXTRACT_POINT_INT64(visit_duration_ms_sketch, 0.5) AS median_visit_duration, hour_of_day FROM user.YOUTUBE_ACCESS_STATS; -- Query YouTube daily stats. SELECT HLL_COUNT.MERGE(distinct_users_sketch), KLL_QUANTILES.MERGE_POINT_INT64(visit_duration_ms_sketch, 0.5) AS median_visit_duration, date FROM user.YOUTUBE_ACCESS_STATS GROUP BY date; -- Query total stats across YouTube and Maps. SELECT HLL_COUNT.MERGE(distinct_users_sketch) AS unique_users_all_services, KLL_QUANTILES.MERGE_POINT_INT64(visit_duration_ms_sketch, 0.5) AS median_visit_duration_all_services, FROM ( SELECT * FROM user.YOUTUBE_ACCESS_STATS UNION ALL SELECT * FROM user.MAPS_ACCESS_STATS );
Como um esboço tem compactação com perdas dos dados originais, ele introduz um erro estatístico que é representado por um limite de erro ou intervalo de confiança (CI, na sigla em inglês). Para a maioria das aplicações, essa incerteza é pequena. Por exemplo, um esboço típico de contagem de cardinalidade tem um erro relativo de cerca de 1% em 95% de todos os casos. Um esboço troca alguma acurácia, ou precisão, por cálculos mais rápidos e baratos e menos armazenamento.
Em resumo, um esboço tem as seguintes propriedades principais:
- Representa um agregado aproximado de uma métrica específica
- É compacto
- É uma forma serializada de uma estrutura de dados sublinear na memória
- Geralmente é um tamanho fixo e assintoticamente menor do que a entrada
- Pode introduzir um erro estatístico que você determina com um nível de precisão
- Pode ser mesclado com outros esboços para resumir a união dos conjuntos de dados
Nova agregação com mesclagem de esboços
Os esboços permitem armazenar e mesclar dados para uma nova agregação eficiente. Isso torna os esboços especialmente úteis para visualizações materializadas de conjuntos de dados. É possível mesclar esboços para criar um resumo de vários fluxos de dados com base em esboços parciais criados para cada fluxo.
Por exemplo, se você criar um esboço para o número estimado de usuários distintos todos os dias, poderá conferir o número de usuários nos últimos sete dias mesclando esboços diários. A reagregação dos esboços diários mesclados ajuda a evitar a leitura da entrada completa do conjunto de dados.
A reagregação do Sketch também é útil no processamento analítico on-line (OLAP, na sigla em inglês). É possível mesclar esboços para criar uma visualização completa de um cubo de OLAP, em que o esboço resume os dados ao longo de uma ou mais dimensões específicas do cubo. Não é possível fazer visualizações completas de OLAP com contagens verdadeiras distintas.
Que tipo de esboço devo usar?
Diferentes algoritmos de esboço são projetados para diferentes tipos de métricas, como HLL++ para contagens distintas e KLL para quartis. O GoogleSQL também oferece funções agregadas aproximadas que podem ser usadas para consultar esses tipos de dados sem precisar especificar detalhes da consulta, como o nível de precisão.
O esboço que você usa depende do tipo de dados que precisa estimar.
Estimar a cardinalidade
Se você precisar estimar a cardinalidade, use um esboço HLL++.
Por exemplo, para conferir o número de usuários únicos que usaram ativamente um produto em um determinado mês (métricas MAU ou 28DAU), use um esboço HLL++.
Calcular um quantil
Se você precisar de um quantil de um conjunto de dados, use um esboço KLL.
Por exemplo, para conferir a duração média da visita dos clientes em uma loja ou para acompanhar a latência do percentil 95 que os tickets ficam em uma fila antes de serem resolvidos, use um esboço KLL.
Sketches HLL
O HyperLogLog++ (HLL++) é um algoritmo de esboço para estimar a cardinalidade. O HLL++ é baseado no documento HyperLogLog in Practice, em que ++ indica os aumentos feitos no algoritmo HyperLogLog.
A cardinalidade é o número de elementos distintos na entrada de um sketch. Por exemplo, você pode usar um esboço HLL++ para descobrir o número de usuários únicos que abriram um aplicativo.
O HLL++ estima a cardinalidade muito pequena e muito grande. O HLL++ inclui uma representação esparsa e de função de hash de 64-bits que reduz os requisitos de memória de estimativas cardinais pequenas e de correções de tendência empírica de estimativas cardinais pequenas.
Precisão
Os sketches HLL++ são compatíveis com precisão personalizada. A tabela a seguir mostra os valores de precisão compatíveis, o tamanho máximo de armazenamento e o intervalo de confiança (CI) dos níveis de precisão típicos:
Precisão | Tamanho máximo de armazenamento | CI de 65% | CI de 95% | CI de 99% |
---|---|---|---|---|
10 | 1 KiB + 28 B | ±3,25% | ±6,50% | ±9.75% |
11 | 2 KiB + 28 B | ±2.30% | ±4,60% | ±6.89% |
12 | 4 KiB + 28 B | ±1,63% | ±3,25% | ±4.88% |
13 | 8 KiB + 28 B | ±1,15% | ±2.30% | ±3.45% |
14 | 16 KiB + 30 B | ±0,81% | ±1,63% | ±2.44% |
15 (padrão) | 32 KiB + 30 B | ±0,57% | ±1,15% | ±1,72% |
16 | 64 KiB + 30 B | ±0,41% | ±0,81% | ±1,22% |
17 | 128 KiB + 30 B | ±0,29% | ±0,57% | ±0,86% |
18 | 256 KiB + 30 B | ±0,20% | ±0,41% | ±0,61% |
19 | 512 KiB + 30 B | ±0,14% | ±0,29% | ±0,43% |
20 | 1024 KiB + 30 B | ±0,10% | ±0,20% | ±0.30% |
21 | 2048 KiB + 32 B | ±0,07% | ±0,14% | ±0.22% |
22 | 4096 KiB + 32 B | ±0,05% | ±0,10% | ±0.15% |
23 | 8192 KiB + 32 B | ±0,04% | ±0,07% | ±0.11% |
24 | 16384 KiB + 32 B | ±0,03% | ±0,05% | ±0.08% |
É possível definir a precisão de um esboço HLL++ ao inicializá-lo com a
função HLL_COUNT.INIT
.
Exclusão
Não é possível excluir valores de um esboço HLL++.
Mais detalhes
Para conferir uma lista das funções que podem ser usadas com esboços HLL++, consulte Funções HLL++.
Integração de esboço
É possível integrar sketches HLL++ a outros sistemas. Por exemplo, é possível criar esboços em aplicativos externos, como o Dataflow, Apache Spark e ZetaSketch e consumi-los no GoogleSQL ou vice-versa.
Além do GoogleSQL, é possível usar esboços HLL++ com Java.
Esboços KLL
O KLL (abreviação de Karnin-Lang-Liberty) é um algoritmo de streaming para calcular esboços para quantis aproximados. Ele calcula os quantis arbitrários de maneira muito mais eficiente do que as computações exatas, com o preço de um pequeno erro de aproximação.
Precisão
Os esboços KLL são compatíveis com precisão personalizada. A precisão define a exatidão de um quantil aproximado q retornado.
Por padrão, a classificação de um quantis aproximado pode estar a no máximo ±1/1000 * n
de ⌈Φ * n⌉
, em que n
é o número de linhas na entrada e ⌈Φ * n⌉
é
a classificação do quantis exato.
Se você fornecer uma precisão personalizada, a classificação do quartil aproximado poderá ser
de no máximo ±1/precision * n
da classificação do quartil exato. O erro
está dentro desse limite em 99,999% dos casos. Essa garantia de erro só
se aplica à diferença entre classificações exatas e aproximadas. A diferença numérica
entre o valor exato e o aproximado de um quartil pode ser
arbitrariamente grande.
Por exemplo, suponha que você queira encontrar o valor mediano, Φ = 0.5
, e use
a precisão padrão de 1000
. Em seguida, o rank do valor retornado pela
função KLL_QUANTILES.EXTRACT_POINT
difere do rank verdadeiro em, no máximo,
n/1000
em 99,999% dos casos. Em outras palavras, o valor retornado é quase
sempre entre o 49,9º e o 50,1º percentil. Se você tiver 1.000.000 de itens no
desenho, a classificação da mediana retornada quase sempre será entre
499.000 e 501.000.
Se você usar uma precisão personalizada de 100
para encontrar o valor mediano, a classificação
do valor retornado pela função KLL_QUANTILES.EXTRACT_POINT
vai diferir da
classificação real em, no máximo, n/100
em 99,999% dos casos. Em outras palavras, o
valor retornado quase sempre fica entre a 49ª e a 51ª percentis. Se você
tiver 1.000.000 de itens no seu esboço, a classificação da mediana retornada será
quase sempre entre 490.000 e 510.000.
É possível definir a precisão de um esboço KLL ao inicializá-lo com a
função KLL_QUANTILES.INIT
.
Tamanho
O tamanho do esboço da KLL depende do parâmetro de precisão e do tipo de entrada.
Se o tipo de entrada for INT64
, os esboços poderão usar uma otimização adicional
que é especialmente útil se os valores de entrada vierem de um universo pequeno. A tabela a seguir contém duas colunas para INT64
. Uma coluna fornece um
limite máximo no tamanho do esboço para itens de um universo limitado de tamanho 1B, e uma
segunda coluna fornece um limite máximo para valores de entrada arbitrários.
Precisão | FLOAT64 | INT64 (<1B) | INT64 (qualquer) |
---|---|---|---|
10 | 761 B | 360 B | 717 B |
20 | 1,46 KB | 706 B | 1,47 KB |
50 | 3,49 KB | 1,72 KB | 3,60 KB |
100 | 6,94 KB | 3,44 KB | 7,12 KB |
200 | 13,87 KB | 6,33 KB | 13,98 KB |
500 | 35,15 KB | 14,47 KB | 35,30 KB |
1000 | 71,18 KB | 27,86 KB | 71,28 KB |
2000 | 144,51 KB | 55,25 KB | 144,57 KB |
5000 | 368,87 KB | 139,54 KB | 368,96 KB |
10000 | 749,82 KB | 282,27 KB | 697,80 KB |
20000 | 1,52 MB | 573,16 KB | 1,37 MB |
50000 | 3,90 MB | 1,12 MB | 3,45 MB |
100000 | 7,92 MB | 2,18 MB | 6,97 MB |
Phi
Phi (Φ) representa o quartil a ser produzido como uma fração do número total de linhas na entrada do esboço, normalizado entre 0 e 1. Se uma função oferece suporte a phi, ela retorna um valor v de modo que aproximadamente Φ * n entradas sejam menores ou iguais a v, e (1-Φ) * n entradas sejam maiores ou iguais a v.
Mais detalhes
Para conferir uma lista de funções que podem ser usadas com esboços KLL, consulte Funções de quartil KLL.
O algoritmo KLL é definido no artigo
Optimal Quantile Approximation in Streams (Aproximação de Percentil Ótimo em Fluxos, em tradução livre) e é nomeado
em homenagem aos autores, Karnin, Lang e Liberty, que publicaram o artigo em 2016.
O algoritmo KLL melhora o algoritmo MP80 mais antigo usando buffers de tamanho variável para reduzir o uso de memória em conjuntos de dados grandes, reduzindo o tamanho do esboço de O(log n)
para O(1)
. Devido à natureza não determinística do algoritmo, os esboços criados
no mesmo conjunto de dados com a mesma precisão podem não ser idênticos.
Quantis
Os quantis são pontos de corte que dividem o intervalo de uma distribuição de probabilidade em intervalos contínuos com probabilidades iguais ou dividem as observações em uma amostra da mesma maneira. Um esboço que oferece suporte a quantis permite estimar quartis resumindo esses intervalos e probabilidades em resultados de quartis quase exatos.
Os quartis são geralmente definidos de duas maneiras:
Para um número inteiro positivo
q
, osq
-quantis são um conjunto de valores que particionam um conjunto de entrada em subconjuntosq
de tamanho quase igual. Alguns deles têm nomes específicos: o único percentil 2 é a mediana, os percentis 4 são quartis, os percentis 100 são percentis, etc. As funções KLL também retornam o mínimo (exato) e o máximo da entrada. Portanto, ao consultar os percentis 2, três valores são retornados.Alternativamente, os quartis podem ser considerados quartis
Φ
individuais, em queΦ
é um número real com0 <= Φ <= 1
. Ox
do percentilΦ
é um elemento da entrada, de modo que uma fraçãoΦ
da entrada seja menor ou igual ax
e uma fração(1-Φ)
seja maior ou igual ax
. Nesta notação, a mediana é o percentil 0,5, e o percentil 95 é o percentil 0,95.
Por exemplo, você pode usar um esboço que oferece suporte a percentis para encontrar a mediana do número de vezes que um aplicativo é aberto pelos usuários.
Funções de agregação aproximada
Como alternativa às funções de aproximação específicas baseadas em esboço, o GoogleSQL fornece funções de agregação aproximada predefinidas. Essas funções agregadas aproximadas são compatíveis com esboços para estimativas comuns, como contagem distinta, quantis e contagem superior, mas não permitem precisão personalizada. Elas também não expõem e armazenam o esboço para nova agregação, como outros tipos de esboços. As funções agregadas aproximadas são projetadas para executar consultas rápidas baseadas em esboços sem configuração detalhada.
Para conferir uma lista de funções agregadas aproximadas que podem ser usadas para aproximação baseada em esboço, consulte Funções agregadas aproximadas.