Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

types de disposition du dictionnaire range_hashed

range_hashed

Le dictionnaire est stocké en mémoire sous la forme d'une table de hachage avec un tableau ordonné de plages et de leurs valeurs correspondantes.

Cette méthode de stockage fonctionne comme hashed et permet d'utiliser, en plus de la clé, des plages de dates/heures (de type numérique arbitraire).

Exemple : la table contient des remises pour chaque annonceur, au format :

┌─advertiser_id─┬─discount_start_date─┬─discount_end_date─┬─amount─┐
│           123 │          2015-01-16 │        2015-01-31 │   0.25 │
│           123 │          2015-01-01 │        2015-01-15 │   0.15 │
│           456 │          2015-01-01 │        2015-01-15 │   0.05 │
└───────────────┴─────────────────────┴───────────────────┴────────┘

Pour utiliser un échantillon avec des plages de dates, définissez les éléments range_min et range_max dans la structure. Ces éléments doivent inclure les éléments name et type (si type n'est pas spécifié, le type par défaut sera utilisé : Date). type peut être n'importe quel type numérique (Date / DateTime / UInt64 / Int32 / autres).

Exemple :

CREATE DICTIONARY discounts_dict (
    advertiser_id UInt64,
    discount_start_date Date,
    discount_end_date Date,
    amount Float64
)
PRIMARY KEY id
SOURCE(CLICKHOUSE(TABLE 'discounts'))
LIFETIME(MIN 1 MAX 1000)
LAYOUT(RANGE_HASHED(range_lookup_strategy 'max'))
RANGE(MIN discount_start_date MAX discount_end_date)

Pour utiliser ces dictionnaires, vous devez passer un argument supplémentaire à la fonction dictGet, auquel une plage est appliquée :

dictGet('dict_name', 'attr_name', id, date)

Exemple de requête :

SELECT dictGet('discounts_dict', 'amount', 1, '2022-10-20'::Date);

Cette fonction renvoie la valeur pour les id spécifiés et la plage de dates qui inclut la date fournie.

Détails de l’algorithme :

  • Si l’id est introuvable ou si aucune plage n’est trouvée pour cet id, elle renvoie la valeur par défaut du type de l’attribut.
  • S’il existe des plages qui se chevauchent et que range_lookup_strategy=min, elle renvoie une plage correspondante dont le range_min est minimal ; si plusieurs plages sont trouvées, elle renvoie une plage dont le range_max est minimal ; si plusieurs plages sont encore trouvées (plusieurs plages ayant le même range_min et le même range_max), elle renvoie l’une d’elles aléatoirement.
  • S’il existe des plages qui se chevauchent et que range_lookup_strategy=max, elle renvoie une plage correspondante dont le range_min est maximal ; si plusieurs plages sont trouvées, elle renvoie une plage dont le range_max est maximal ; si plusieurs plages sont encore trouvées (plusieurs plages ayant le même range_min et le même range_max), elle renvoie l’une d’elles aléatoirement.
  • Si range_max vaut NULL, la plage est ouverte. NULL est traité comme la valeur maximale possible. Pour range_min, 1970-01-01 ou 0 (-MAX_INT) peuvent être utilisés comme valeur ouverte.

Exemple de configuration :

CREATE DICTIONARY somedict(
    Abcdef UInt64,
    StartTimeStamp UInt64,
    EndTimeStamp UInt64,
    XXXType String DEFAULT ''
)
PRIMARY KEY Abcdef
RANGE(MIN StartTimeStamp MAX EndTimeStamp)

Exemple de configuration avec des plages qui se chevauchent et des plages ouvertes :

CREATE TABLE discounts
(
    advertiser_id UInt64,
    discount_start_date Date,
    discount_end_date Nullable(Date),
    amount Float64
)
ENGINE = Memory;

INSERT INTO discounts VALUES (1, '2015-01-01', Null, 0.1);
INSERT INTO discounts VALUES (1, '2015-01-15', Null, 0.2);
INSERT INTO discounts VALUES (2, '2015-01-01', '2015-01-15', 0.3);
INSERT INTO discounts VALUES (2, '2015-01-04', '2015-01-10', 0.4);
INSERT INTO discounts VALUES (3, '1970-01-01', '2015-01-15', 0.5);
INSERT INTO discounts VALUES (3, '1970-01-01', '2015-01-10', 0.6);

SELECT * FROM discounts ORDER BY advertiser_id, discount_start_date;

complex_key_range_hashed

Le dictionnaire est stocké en mémoire sous la forme d’une table de hachage avec un tableau ordonné de plages et de leurs valeurs correspondantes (voir range_hashed). Ce type de stockage s’utilise avec des clés composites.

Exemple de configuration :

CREATE DICTIONARY range_dictionary
(
  CountryID UInt64,
  CountryKey String,
  StartDate Date,
  EndDate Date,
  Tax Float64 DEFAULT 0.2
)
PRIMARY KEY CountryID, CountryKey
SOURCE(CLICKHOUSE(TABLE 'date_table'))
LIFETIME(MIN 1 MAX 1000)
LAYOUT(COMPLEX_KEY_RANGE_HASHED())
RANGE(MIN StartDate MAX EndDate);
Navigation