Estimativa de valores frequentes¶
O Snowflake utiliza o algoritmo Space-Saving, uma forma eficiente de estimar valores frequentes aproximados em conjuntos de dados.
Neste tópico:
Visão geral¶
O Snowflake fornece uma implementação do algoritmo Space-Saving apresentado em Computação eficiente de elementos frequentes e Top-k em fluxos de dados por Metwally, Agrawal e Abbadi. Ele é implementado através da família APPROX_TOP_K de funções.
Além disso, a função APPROX_TOP_K_COMBINE utiliza o algoritmo Space-Saving paralelo delineado por Cafaro, Pulimeno e Tempesta.
A porcentagem de erro para o algoritmo depende muito da inclinação dos dados e do número de contadores utilizados no algoritmo. Conforme os dados se tornam mais inclinados, ou mais contadores são utilizados, a saída será mais precisa.
Funções SQL¶
As seguintes Funções de agregação são fornecidas para usar o Space-Saving para estimar valores frequentes:
APPROX_TOP_K: Retorna uma aproximação dos valores frequentes na entrada.
APPROX_TOP_K_ACCUMULATE: Pula a etapa de estimativa final e retorna o estado Space-Saving no final de uma agregação.
APPROX_TOP_K_COMBINE: Combina (ou seja, funde) os estados de entrada em um único estado de saída.
APPROX_TOP_K_ESTIMATE: Compila uma estimativa de cardinalidade de um estado Space-Saving produzida por APPROX_TOP_K_ACCUMULATE e APPROX_TOP_K_COMBINE.
Detalhes de implementação¶
Cada contador em nossa implementação rastreia um item e sua frequência. Notavelmente, nossa implementação não rastreia os valores ípsilon dos contadores, pois eles só são úteis para dar garantias sobre a saída do algoritmo; eles não são usados para o algoritmo em si.
O número máximo de contadores está definido em 100 mil. Neste caso, há 100 mil contadores armazenados na memória, mas apenas uma fração destes são armazenados em um estado exportado.
O número máximo de k
é de 100 mil. Este valor é automaticamente reduzido se os valores não puderem todos caber na saída.
Na maioria dos casos, o tempo de execução de nossa implementação não depende do número de contadores. Nossa implementação garante que o número de contadores não tenha um efeito perceptível sobre o tempo de execução do algoritmo.
Cada contador em cada estado de agregação utiliza uma quantidade constante de sobrecarga de memória de cerca de 100 bytes. Assim, se uma agregação usar c
contadores e houver g
grupos de agregação, a agregação usará c * g * 100B
de memória, mais memória para armazenar os valores. Se esta memória exceder o orçamento total de memória, a memória é vazada para o disco. Isto é muito menos memória do que a versão exata usaria, especialmente quando há um grande número de valores únicos.