Catégories :

Fonctions d’agrégation (estimation de la cardinalité), Fonctions de la fenêtre

HLL_ACCUMULATE

Renvoie l’état HyperLogLog à la fin de l’agrégation.

Pour plus d’informations sur HyperLogLog, voir Estimation du nombre de valeurs distinctes.

HLL rejette son état intermédiaire lorsque l’estimation de cardinalité finale est renvoyée. Dans les cas d’utilisation avancés, tels que l’estimation de la cardinalité incrémentielle pendant le chargement en bloc, il peut être souhaitable de conserver l’état intermédiaire. L’état intermédiaire peut ensuite être combiné (fusionné) avec d’autres états intermédiaires ou peut être exporté vers des outils externes.

Contrairement à HLL, HLL_ACCUMULATE ne renvoie pas d’estimation de cardinalité. Au lieu de cela, il saute la dernière étape d’estimation et renvoie l’état de l’algorithme lui-même. L’état est un binaire de 4096 octets au maximum. Pour plus d’informations, voir Estimation du nombre de valeurs distinctes.

Voir aussi :

HLL_COMBINE , HLL_ESTIMATE

Syntaxe

HLL_ACCUMULATE( [ DISTINCT ] <expr> )

HLL_ACCUMULATE(*)

Arguments

expr

L’expression pour laquelle vous souhaitez estimer la cardinalité (nombre de valeurs distinctes). Il s’agit généralement d’un nom de colonne, mais il peut s’agir d’une expression plus générale.

Notes sur l’utilisation

  • DISTINCT peut être inclus comme argument, mais n’a aucun effet.

Exemples

Ceci montre une étape de l’estimation du nombre de codes postaux distincts dans la ou les provinces du Canada. Dans cette étape, nous calculons le nombre approximatif de codes postaux distincts au Manitoba et stockons une représentation interne de « l’état » du calcul, que nous pourrons ensuite combiner avec des informations similaires pour d’autres provinces :

CREATE TABLE temporary_hll_state_for_manitoba AS
 SELECT HLL_ACCUMULATE(postal_code) as h_a_p_c
  FROM postal_data
  WHERE province = 'Manitoba'
  ;

Voici un autre exemple. Cet exemple montre comment utiliser les trois fonctions associées HLL_ACCUMULATE, HLL_ESTIMATE et HLL_COMBINE.

Créez une table et des données simples :

-- Create a sequence to use to generate values for the table.
CREATE OR REPLACE SEQUENCE seq92;
CREATE OR REPLACE TABLE sequence_demo (c1 INTEGER DEFAULT seq92.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;

Créez une table contenant « l’état » qui représente les informations de cardinalité approximative actuelles de la table nommée sequence_demo :

CREATE OR REPLACE TABLE resultstate1 AS (
     SELECT hll_accumulate(c1) AS rs1
        FROM sequence_demo);

Créez maintenant une deuxième table et ajoutez des données. (Dans une situation plus réaliste, l’utilisateur aurait pu charger plus de données dans la première table et les diviser en ensembles ne se chevauchant pas en fonction de l’heure à laquelle les données ont été chargées.)

CREATE OR REPLACE TABLE test_table2 (c1 INTEGER);
-- Insert data.
INSERT INTO test_table2 (c1) SELECT c1 + 4 FROM sequence_demo;

Obtenez les informations « d’état » pour les nouvelles données uniquement.

CREATE OR REPLACE TABLE resultstate2 AS 
  (SELECT hll_accumulate(c1) AS rs1 
     FROM test_table2);

Combiner les informations « d’état » pour les deux lots de lignes :

CREATE OR REPLACE TABLE combined_resultstate (c1) AS 
  SELECT hll_combine(rs1) AS apc1
    FROM (
        SELECT rs1 FROM resultstate1
        UNION ALL
        SELECT rs1 FROM resultstate2
      )
      ;

Obtenez la cardinalité approximative de l’ensemble combiné de lignes :

SELECT hll_estimate(c1) FROM combined_resultstate;

Sortie :

+------------------+
| HLL_ESTIMATE(C1) |
|------------------|
|               12 |
+------------------+