A função APPROX_COUNT_DISTINCT retorna uma contagem aproximada de valores distintos em uma coluna. Ela troca uma pequena parcela configurável de precisão por uma sobrecarga de estado significativamente menor no nó de agregação, o que a torna ideal para cenários de alta cardinalidade, como a contagem de visitantes únicos (UV), quando não é necessária uma contagem exata.
Requisito de versão: Ververica Runtime (VVR) 3.0.0 ou posterior.
Quando usar
Use APPROX_COUNT_DISTINCT em vez de COUNT DISTINCT quando as duas condições abaixo forem verdadeiras:
A coluna tem um grande número de chaves distintas (por exemplo, IDs de usuário, tokens de sessão, URLs). A função não oferece benefícios significativos de desempenho para colunas de baixa cardinalidade.
O fluxo de entrada não contém mensagens de retração.
Se alguma dessas condições não for atendida, use COUNT DISTINCT.
Como funciona
Para gerar um resultado exato, COUNT DISTINCT precisa armazenar cada chave distinta nos dados de estado. Em colunas de alta cardinalidade, isso gera sobrecarga significativa de leitura e escrita e se torna um gargalo de desempenho.
Já APPROX_COUNT_DISTINCT estima a contagem de valores distintos sem armazenar todas as chaves. Essa abordagem elimina o gargalo de estado e permite as otimizações miniBatch e local-global no nó de agregação.
O parâmetro accuracy controla a precisão do cálculo. Um valor maior indica maior precisão, mas também aumenta a sobrecarga de estado e reduz a vantagem de desempenho em relação a COUNT DISTINCT.
Sintaxe
APPROX_COUNT_DISTINCT(col [, accuracy])
Parâmetros
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
Todos os tipos de dados |
Sim |
Coluna na qual contar os valores distintos. |
|
|
FLOAT |
Não |
Precisão do cálculo. Valores válidos: |
Exemplo
O exemplo a seguir compara os resultados obtidos com a precisão padrão (0.99) e com uma precisão menor (0.9).
Tabela de entrada T1
|
a (VARCHAR) |
b (BIGINT) |
|
Hi |
1 |
|
Hi |
2 |
|
Hi |
3 |
|
Hi |
4 |
|
Hi |
5 |
|
Hi |
6 |
|
Hello |
1 |
|
Hello |
2 |
|
Hello |
3 |
|
Hello |
4 |
Consulta
SELECT
a,
APPROX_COUNT_DISTINCT(b) AS b,
APPROX_COUNT_DISTINCT(b, 0.9) AS c
FROM T1
GROUP BY a;
Resultados
|
a (VARCHAR) |
b (BIGINT) |
c (BIGINT) |
|
Hi |
6 |
6 |
|
Hello |
4 |
4 |
A coluna b usa a precisão padrão de 0.99; a coluna c usa 0.9.