Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

tipos de disposición del diccionario range_hashed

range_hashed

El diccionario se almacena en memoria en forma de una tabla hash con un array ordenado de rangos y sus valores correspondientes.

Este método de almacenamiento funciona igual que hashed y permite usar rangos de fecha y hora (de cualquier tipo numérico), además de la clave.

Ejemplo: la tabla contiene descuentos para cada anunciante en el formato:

┌─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 │
└───────────────┴─────────────────────┴───────────────────┴────────┘

Para usar una muestra para rangos de fechas, defina los elementos range_min y range_max en la estructura. Estos elementos deben incluir name y type (si no se especifica type, se usará el tipo predeterminado: Date). type puede ser cualquier tipo numérico (Date / DateTime / UInt64 / Int32 / otros).

Ejemplo:

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)

Para trabajar con estos diccionarios, debe pasar un argumento adicional a la función dictGet, para el que se selecciona un rango:

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

Ejemplo de consulta:

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

Esta función devuelve el valor de los id especificados y el rango de fechas que incluye la fecha proporcionada.

Detalles del algoritmo:

  • Si no se encuentra el id o no se encuentra ningún rango para ese id, devuelve el valor predeterminado del tipo del atributo.
  • Si hay rangos superpuestos y range_lookup_strategy=min, devuelve un rango coincidente con el range_min mínimo; si se encuentran varios rangos, devuelve uno con el range_max mínimo; si aun así se encuentran varios rangos (es decir, varios rangos tienen el mismo range_min y range_max), devuelve uno aleatorio de entre ellos.
  • Si hay rangos superpuestos y range_lookup_strategy=max, devuelve un rango coincidente con el range_min máximo; si se encuentran varios rangos, devuelve uno con el range_max máximo; si aun así se encuentran varios rangos (es decir, varios rangos tienen el mismo range_min y range_max), devuelve uno aleatorio de entre ellos.
  • Si range_max es NULL, el rango es abierto. NULL se trata como el valor máximo posible. Para range_min, se puede usar 1970-01-01 o 0 (-MAX_INT) como valor abierto.

Ejemplo de configuración:

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

Ejemplo de configuración con rangos superpuestos y abiertos:

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

El diccionario se almacena en memoria en forma de tabla hash, con un array ordenado de rangos y sus valores correspondientes (consulte range_hashed). Este tipo de almacenamiento está diseñado para usarse con claves compuestas.

Ejemplo de configuración:

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