- Categorias:
Funções de agregação (Estimativa de frequência) , Funções de janela
APPROX_TOP_K_COMBINE¶
Combina (funde) os estados de entrada em apenas um estado de saída.
Isto permite cenários onde APPROX_TOP_K_ACCUMULATE é executado sobre partições horizontais da mesma tabela, produzindo um estado de algoritmo para cada partição da tabela. Estes estados podem ser combinados mais tarde usando APPROX_TOP_K_COMBINE, produzindo o mesmo estado de saída que uma única execução de APPROX_TOP_K_ACCUMULATE sobre toda a tabela.
- Consulte também:
Sintaxe¶
APPROX_TOP_K_COMBINE( <state> [ , <counters> ] )
Argumentos¶
state
Uma expressão que contém informações de estado geradas por uma chamada para APPROX_TOP_K_ACCUMULATE.
counters
Este é o número máximo de valores distintos que podem ser rastreados de cada vez durante o processo de estimativa. Por exemplo, se
counters
estiver definido como 100000, então o algoritmo rastreia 100.000 valores distintos, tentando manter os 100.000 valores mais frequentes.O número máximo de
counters
é100000
(100.000).
Retornos¶
Isto retorna informações sobre o “estado” do cálculo top K.
Estas informações de estado não são normalmente úteis por si só, mas podem ser passadas para a função APPROX_TOP_K_ESTIMATE
.
Notas de uso¶
Se
counters
estiver definido, o estado de saída utiliza o número especificado de contadores.Se
counters
não estiver definido, todos os estados de entrada devem ter o mesmo número de contadores.
Exemplos¶
Este exemplo mostra como usar as três funções relacionadas APPROX_TOP_K_ACCUMULATE
, APPROX_TOP_K_ESTIMATE
e APPROX_TOP_K_COMBINE
.
Nota
Este exemplo utiliza mais contadores do que valores de dados distintos para obter resultados consistentes. Em aplicações do mundo real, o número de valores distintos é geralmente maior do que o número de contadores, portanto, as aproximações podem variar.
Este exemplo gera uma tabela com 8 linhas que possuem valores 1 - 8, e uma segunda tabela com 8 linhas que têm valores 5 - 12. Assim, os valores mais frequentes na união das duas tabelas são os valores 5-8, cada um deles com uma contagem de 2.
Criar uma tabela e dados simples:
-- Create a sequence to use to generate values for the table. CREATE OR REPLACE SEQUENCE seq91; CREATE OR REPLACE TABLE sequence_demo (c1 INTEGER DEFAULT seq91.nextval, dummy SMALLINT); INSERT INTO sequence_demo (dummy) VALUES (0); -- Double the number of rows a few times, until there are 8 rows: INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo; INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo; INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;Criar uma tabela que contenha o “estado” que representa as informações atuais aproximadas do Top K para a tabela chamada sequence_demo:
CREATE OR REPLACE TABLE resultstate1 AS ( SELECT approx_top_k_accumulate(c1, 50) AS rs1 FROM sequence_demo);Agora crie uma segunda tabela e adicione dados. (Em uma situação mais realista, o usuário poderia ter carregado mais dados na primeira tabela e dividido os dados em conjuntos não sobrepostos com base no tempo em que os dados foram carregados).
CREATE OR REPLACE TABLE test_table2 (c1 INTEGER); -- Insert data. INSERT INTO test_table2 (c1) SELECT c1 + 4 FROM sequence_demo;Obtenha as informações de “estado” apenas para os novos dados.
CREATE OR REPLACE TABLE resultstate2 AS (SELECT approx_top_k_accumulate(c1, 50) AS rs1 FROM test_table2);Combine as informações de “estado” para os dois lotes de linhas:
CREATE OR REPLACE TABLE combined_resultstate (c1) AS SELECT approx_top_k_combine(rs1) AS apc1 FROM ( SELECT rs1 FROM resultstate1 UNION ALL SELECT rs1 FROM resultstate2 ) ;Obtenha o valor aproximado do Top K do conjunto combinado de linhas:
SELECT approx_top_k_estimate(c1, 4) FROM combined_resultstate;Saída:
+------------------------------+ | APPROX_TOP_K_ESTIMATE(C1, 4) | |------------------------------| | [ | | [ | | 5, | | 2 | | ], | | [ | | 6, | | 2 | | ], | | [ | | 7, | | 2 | | ], | | [ | | 8, | | 2 | | ] | | ] | +------------------------------+